Tạo tập tin patch hoặc diff từ kho git và áp dụng nó vào kho git khác


155

Tôi làm việc trên dự án dựa trên WordPress và tôi muốn vá dự án của mình tại mỗi phiên bản phát hành mới của WP. Đối với điều này, tôi muốn tạo ra một bản vá giữa hai lần xác nhận hoặc thẻ.

Ví dụ, trong repo của /www/WPtôi, tôi làm điều này:

$git patch-format com1..com2 --stdout > ~/patchs/mypatch.patch

Hoặc là

$git patch-format tag1..tag2 --stdout > ~/patchs/mypatch.patch

/www/WP git natif WordPress

/www/myproject Dự án git của tôi dựa trên WordPress

Dòng git applylệnh không hoạt động, tôi nghĩ bởi vì chúng ta đang ở trong các kho khác nhau.

Tôi có thể tạo tệp vá mà không cần cam kết, chỉ cần vi sai và áp dụng nó cho kho lưu trữ git khác không?

Cảm ơn trước.

Câu trả lời:


243

Bạn chỉ có thể sử dụng git diffđể tạo ra một khác biệt phù hợp cho git apply:

git diff tag1..tag2 > mypatch.patch

Sau đó, bạn có thể áp dụng bản vá kết quả với:

git apply mypatch.patch

1
Cảm ơn Enrico, tôi đã sử dụng $git diff -u tag1..tag2 > mypatch.patch$git apply --stat > mypatch.patchcâu trả lời là 0 files changedbất kỳ đề nghị nào khác xin vui lòng? :)
zatamine

Bạn cần chỉ định đường dẫn đến tệp vá làm đối số của git apply. Tôi đã cập nhật câu trả lời của tôi với một ví dụ.
Enrico Campidoglio

1
Tôi đã sử dụng git diff -p tag1 tag2 > my.patchmà làm việc tốt.
barclay

Làm cách nào để tạo các bản vá ở định dạng khác nhau? sourceware.org/glibc/wiki/ cảm nói Only unified diff (-uNr) format is acceptable.nhưng khi tôi thử git diff -uNr tag1..tag2 > mypatch.patchtôi nhận được tin nhắnusage: git diff [<options>] [<commit> [<commit>]] [--] [<path>...]
Aaron Franke

2
Hãy cẩn thận git diff ...+ git apply ...không xử lý các tệp bị xóa / di chuyển đúng cách ... khi git format-patch ...+ git am ...làm.
vrince

50

Để tạo bản vá cho một số cam kết, bạn nên sử dụng format-patchlệnh git, ví dụ:

git format-patch -k --stdout R1..R2

Điều này sẽ xuất các cam kết của bạn thành tệp vá ở định dạng hộp thư.

Để tạo bản vá cho lần xác nhận cuối cùng, hãy chạy:

git format-patch -k --stdout HEAD^

Sau đó, trong kho lưu trữ khác áp dụng bản vá bằng amlệnh git, vd

git am -3 -k file.patch

Xem: man git-format-patchgit-am.


1
Điều gì về một bản vá có thể được áp dụng với patch -p1? sourceware.org/glibc/wiki/ trộm
Aaron Franke

Tôi đã chuyển bản vá từ linux sang winodws, vì vậy phải sử dụng --ignore-whitespace như đã đề cập ở đây stackoverflow.com/questions/13190679/NH
Mahesh

2
@AaronFranke, bạn có thể thử tùy chọn '-p': git format-patch -p Head ^ 1
Piroxiljin

Lưu ý, điều này có lợi thế là giữ các thông điệp cam kết, tác giả và ngày cam kết của các cam kết ban đầu.
M. Justin

0

Để bổ sung, để tạo bản vá chỉ cho một cam kết cụ thể, hãy sử dụng:

git format-patch -1 <sha>

Khi tệp vá được tạo, hãy đảm bảo rằng repo khác của bạn biết nó ở đâu khi bạn sử dụng git am ${patch-name}

Trước khi thêm bản vá, sử dụng git apply --check ${patch-name}để đảm bảo rằng không có sự kết tội.

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.