สร้างไฟล์ patch หรือ diff จาก git repository และนำไปใช้กับ git repository อื่น


155

ฉันทำงานกับโครงการที่ใช้ WordPress และฉันต้องการแก้ไขโครงการของฉันที่ WP รุ่นใหม่แต่ละรุ่น สำหรับสิ่งนี้ฉันต้องการสร้างแพทช์ระหว่างสองคอมมิทหรือแท็ก

ตัวอย่างเช่นใน repo ของ/www/WPฉันฉันทำสิ่งนี้:

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

หรือ

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

/www/WP ตอนนี้ WordPress

/www/myproject โครงการ WordPress ของฉันคอมไพล์ตาม

git applyบรรทัดคำสั่งไม่ทำงานผมคิดว่าเพราะเราอยู่ในที่เก็บที่แตกต่างกัน

ฉันสามารถสร้างไฟล์ปะแก้โดยไม่มีการคอมมิตเพียงส่วนต่างและนำไปใช้กับที่เก็บ git อื่นได้หรือไม่

ขอบคุณล่วงหน้า

คำตอบ:


243

คุณสามารถใช้git diffเพื่อสร้างdiff แบบรวมที่เหมาะสมสำหรับgit apply:

git diff tag1..tag2 > mypatch.patch

จากนั้นคุณสามารถใช้แพทช์ผลลัพธ์กับ:

git apply mypatch.patch

1
ขอบคุณ Enrico ฉันใช้$git diff -u tag1..tag2 > mypatch.patchและ$git apply --stat > mypatch.patchคำตอบคือ0 files changedข้อเสนอแนะอื่น ๆ โปรด? :)
zatamine

git applyคุณต้องระบุเส้นทางไปยังแฟ้มแพทช์เป็นอาร์กิวเมนต์ของ ฉันอัปเดตคำตอบด้วยตัวอย่าง
Enrico Campidoglio

1
ฉันใช้git diff -p tag1 tag2 > my.patchซึ่งทำงานได้ดี
บาร์เคลย์

ฉันจะสร้างแพตช์ในรูปแบบ diff แบบรวมได้อย่างไร sourceware.org/glibc/wiki/…พูดOnly unified diff (-uNr) format is acceptable.แต่เมื่อฉันลองgit diff -uNr tag1..tag2 > mypatch.patchฉันจะได้รับข้อความusage: git diff [<options>] [<commit> [<commit>]] [--] [<path>...]
Aaron Franke

2
ระวังgit diff ...+ git apply ...อย่าจัดการไฟล์ที่ถูกลบ / ย้ายอย่างถูกต้อง ... เมื่อgit format-patch ...+ git am ...ทำ
vrince

50

ในการสร้างโปรแกรมปะแก้สำหรับหลายคอมมิทคุณควรใช้format-patchคำสั่ง git เช่น

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

สิ่งนี้จะส่งออกข้อผูกพันของคุณไปยังไฟล์ปะแก้ในรูปแบบกล่องจดหมาย

ในการสร้างแพ็ตช์สำหรับการคอมมิทล่าสุดให้รัน:

git format-patch -k --stdout HEAD^

จากนั้นในที่เก็บอื่นให้ใช้โปรแกรมแก้ไขด้วยamคำสั่ง git เช่น

git am -3 -k file.patch

ดู: และman git-format-patchgit-am


1
แพทช์ที่สามารถใช้กับpatch -p1อะไรได้บ้าง sourceware.org/glibc/wiki/…
Aaron Franke

ผมกำลังจะย้ายไปแพทช์จากลินุกซ์ที่จะ Winodws เพื่อให้มีการใช้ช่องว่างละเลยเป็นที่กล่าวถึงที่นี่stackoverflow.com/questions/13190679/...
Mahesh

2
@AaronFranke คุณสามารถลองตัวเลือก '-p': git format-patch -p HEAD ^ 1
Piroxiljin

สิ่งนี้มีข้อดีในการเก็บรักษาข้อความส่งผู้แต่งและส่งมอบวันที่ที่ส่งต้นฉบับ
M. Justin

0

ในฐานะที่เป็นส่วนประกอบในการผลิตแพทช์สำหรับการคอมมิทที่เจาะจงเพียงครั้งเดียวให้ใช้:

git format-patch -1 <sha>

เมื่อสร้างไฟล์แพตช์ตรวจสอบให้แน่ใจว่า repo อื่น ๆ ของคุณรู้ว่าอยู่ที่ไหนเมื่อคุณใช้ git am ${patch-name}

ก่อนเพิ่มแพตช์ให้ใช้git apply --check ${patch-name}เพื่อให้แน่ใจว่าไม่มีข้อผิดพลาด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.