2013-07-26 21 views
11

Tôi đang cố gắng áp dụng bản vá cho tệp bằng cách sử dụng git apply. Bản vá tổng thể không thành công, vì vậy tôi đã sử dụng git apply --reject.Làm cách nào để áp dụng các khối bị từ chối sau khi sửa chúng?

Kiểm tra tệp được tạo ra .rej cho tôi biết có vấn đề gì, bây giờ tôi đã khắc phục sự cố trong tệp .rej.

Nhưng cố gắng áp dụng các tập tin .rej thất bại với thông điệp

gây tử vong: mảnh vá mà không tiêu đề ở dòng 2: ...

Có cách nào để áp dụng lại .rej tệp sau khi khắc phục sự cố ở đó? Hoặc tôi có phải sửa đổi bản vá gốc và phải chạy lại git apply không?

Điều này sẽ hơi cồng kềnh trong trường hợp đó vì bản gốc chứa các bản vá cho hàng tá tệp và tôi không muốn git checkout các sửa đổi được áp dụng để tái phân phối toàn bộ tệp vá cố định.

Trả lời

6

Để làm rõ what @julian-squires said, sự cố là tệp .rej thiếu một số nội dung nhỏ giữa diff a/thefile...@@ -line/columns....

ORIGINAL .rej tập tin

diff a/the/original/file.cs b/the/original/file.cs (rejected hunks) 
@@ -27,9 +27,9 @@ whatever was on that line 

Bạn cần phải sao chép một/tên tập tin b từ dòng diff và thêm chúng với các chỉ số thay đổi dưới đây, như:

CẬP NHẬT .rej tệp

diff a/the/original/file.cs b/the/original/file.cs (rejected hunks) 
--- a/the/original/file.cs 
+++ b/the/original/file.cs 
@@ -27,9 +27,9 @@ whatever was on that line 

Sau đó, bạn có thể áp dụng các tệp .rej như bản vá thông thường.

+0

Cảm ơn bạn đã giải thích. Tôi sẽ kiểm tra câu trả lời của bạn bởi vì nó là tiếng Anh đơn giản thay vì Bash đồng bằng ... – eckes

0

Không có cách nào xung quanh phải sửa đổi thủ công các tệp có tệp .rej. Bạn nói rằng bạn đã sửa lỗi này. Khi tất cả các vấn đề về .rej đã được xử lý, bạn đã sẵn sàng cho git commit. git apply --reject vẫn tiết kiệm được một chút thời gian trong đó git apply --reject sẽ sửa đổi các tệp có thể.

2

Gần đây, tôi gặp sự cố này khi đang sử dụng git am --reject để áp dụng một loạt các bản vá. Con đường tôi tiếp cận nó là để xoa bóp các tiêu đề .rej tập tin vào một cái gì đó patch(1) sẽ nhận ra, với

sed -e 's/^diff a\/\(.*\) b\/\(.*\)[[:space:]].*rejected.*$/--- \1\n+++ \2/' 

và sửa đổi chúng với emacs (có diff-mode sẽ cập nhật dòng đếm trong hunks khi bạn sửa đổi các bản vá) và áp dụng chúng với patch.

công việc của tôi đã kết thúc như thế này:

$ (for i in $(find . -name \*.rej); do 
    sed -e 's/^diff a\/\(.*\) b\/\(.*\)[[:space:]].*rejected.*$/--- \1\n+++ \2/' -i $i && 
    emacsclient $i && 
    patch -p0 < $i; 
    done) && git add -u && git clean -xdf && git am --continue 

với việc thiết lập macro thích hợp trong emacs cho các trường hợp định kỳ. Không phải là cách tiếp cận trang nhã nhất, nhưng nó hoạt động.

+0

thật đáng buồn, [Tôi không thể nói Linux ...] (http://stackoverflow.com/a/28569128/1037948) – drzaus

Các vấn đề liên quan