Làm cách nào để áp dụng bản vá `git diff` mà không cài đặt Git?


280

Làm thế nào khách hàng của tôi có thể áp dụng bản vá được tạo bởi git diffmà không cần cài đặt git? Tôi đã cố gắng sử dụng patchlệnh nhưng nó luôn yêu cầu tên tệp để vá.


4
Bất cứ ai cũng biết làm thế nào để làm điều này nếu bản vá bao gồm đổi tên? Liệu bản vá hỗ trợ mà bây giờ?
Paul Crowley

3
Câu hỏi nên thực sự là: có cách nào để áp dụng git diff mà không cần cài đặt git không? Như đã lưu ý dưới đây , patchkhông hỗ trợ đầy đủ định dạng này.
Aryeh Leib Taurog

Câu trả lời:


425
git diff > patchfile

patch -p1 < patchfile

làm việc nhưng như nhiều người nhận thấy trong các bình luận và các bản vá câu trả lời khác không hiểu thêm, xóa và đổi tên. Không có tùy chọn nhưng git apply patchfilenếu bạn cần xử lý thêm tập tin, xóa và đổi tên.


EDIT tháng 12 năm 2015

Các phiên bản patchlệnh mới nhất (2.7, được phát hành vào tháng 9 năm 2012) hỗ trợ hầu hết các tính năng của định dạng "diff --git", bao gồm đổi tên và sao chép, thay đổi quyền và khác biệt symlink (nhưng chưa phải là khác biệt nhị phân) ( thông báo phát hành ).

Vì vậy, với điều kiện một người sử dụng phiên bản hiện tại / mới nhất patchthì không cần phải sử dụng gitđể có thể áp dụng diff của nó như một bản vá.


97
Hoặc sử dụng git diff > patchfile, nhưngpatch -p1 < patchfile
Jakub Narębski

11
Nếu bạn muốn tạo một patchfile của một đường dẫn con của kho lưu trữ, bạn có thể sử dụng relativetùy chọn như:git diff --no-prefix --relative=my/relative/path > patchfile
Koen.

2
patch -p1 < patchfilekhông yêu cầu cài đặt git. Lệnh đầu tiên thể hiện lệnh để tạo diff, không áp dụng nó.
Andrey Kuznetsov

1
Bản vá được tạo ra là dành cho những thay đổi từ nhánh / refspec được chỉ định trong lệnh đến nhánh hiện tại hoặc nhánh đang hoạt động. Nói cách khác, bạn muốn git diff from_branch > patchfile; git checkout from_branch; git patch -p1 < patchfilehoặcgit diff from_branch to_branch > patchfile; ...
hobs

1
@PaulChechetin Như egor83 đã nói trong câu trả lời của suppie, nó thoát khỏi dấu gạch chéo ngay từ đầu.
Andrey Kuznetsov


49

Sử dụng

git apply patchfile

nếu có thể.

patch -p1 < patchfile 

có tác dụng phụ tiềm năng.

git applycũng xử lý các tệp thêm, xóa và đổi tên nếu chúng được mô tả ở git diffđịnh dạng, điều patchnày sẽ không được thực hiện. Cuối cùng, git applylà một mô hình "áp dụng tất cả hoặc hủy bỏ tất cả" trong đó mọi thứ được áp dụng hoặc không có gì, trong khi bản vá có thể áp dụng một phần các tệp vá, khiến thư mục làm việc của bạn ở trạng thái lạ.


1
+1, Câu trả lời lành mạnh duy nhất. Hơn nữa, diff / patch sẽ không xử lý các liên kết tượng trưng, ​​đây là một vấn đề nếu (ví dụ) bạn đang hoàn nguyên bản vá kernel 3.10 Linux.
ignis

10
Vâng, git applylà cách tốt nhất để làm điều đó, nhưng câu hỏi này đặc biệt hỏi cách áp dụng bản vá mà không cần cài đặt Git .
Colin D Bennett

1
Các tùy chọn --dry-run --verboserất hữu ích để xác định tác dụng phụ sẽ là gì, nếu có. (sử dụng bản vá v2.5.8)
spyle

@ignis - " git apply patchfile -... câu trả lời lành mạnh duy nhất ..." - điều đó gần như buồn cười. Mỗi lần các nhà phát triển OpenSSL gửi cho tôi một bản vá để kiểm tra, Git không áp dụng nó. Đó là mọi lúc. Tôi vẫn chưa thấy công cụ ngu ngốc đó áp dụng một bản vá.
jww

8

tôi sử dụng

patch -p1 --merge < patchfile

Bằng cách này, xung đột có thể được giải quyết như bình thường.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.