จะใช้โปรแกรมปะแก้ที่สร้างด้วย git format-patch ได้อย่างไร?


221

ฉันมีที่เก็บโลคัล 2 git ทั้งคู่ชี้ไปที่ที่เก็บรีโมตเดียวกัน

ในที่เก็บ git หนึ่งถ้าฉันทำได้ฉันจะgit format-patch 1ใช้โปรแกรมแก้ไขนั้นกับที่เก็บอื่นได้อย่างไร

คำตอบ:


330

หมายเหตุ: คุณสามารถดูตัวอย่างก่อนว่าแพทช์ของคุณจะทำอะไร:

อันดับแรกคือ:

git apply --stat a_file.patch

จากนั้นเรียกใช้แบบแห้งเพื่อตรวจหาข้อผิดพลาด:

git apply --check a_file.patch

ในที่สุดคุณสามารถใช้git amเพื่อใช้แพทช์ของคุณเป็นการกระทำ: มันช่วยให้คุณสามารถออกจากแพทช์ที่ใช้
สิ่งนี้มีประโยชน์สำหรับการอ้างอิงในภายหลัง

git am --signoff < a_file.patch 

ดูตัวอย่างในบทความนี้ :

ในบันทึกการคอมไพล์ของคุณคุณจะพบว่าข้อความยืนยันมีแท็ก“ ลงชื่อออกโดย” แท็กนี้จะถูกอ่านโดย Github และอื่น ๆ เพื่อให้ข้อมูลที่เป็นประโยชน์เกี่ยวกับวิธีการส่งมอบสิ้นสุดลงในรหัส

ตัวอย่าง


9
หมายเหตุตนเอง: ป้ายทองคำคำตอบที่ดี 200 คำ
VonC

4
git am < somepatch.patchให้ผล "ร้ายแรง: ชื่อ ident ว่างเปล่า (สำหรับ <>) ไม่อนุญาต" บางคนสามารถอธิบายให้ฉันทำไม
gromit190

@ gromit190 นั่นหมายความว่าไม่ดีAuthorหัวในแพทช์และ / git config user.{name,email}หรือคุณไม่ได้
ulidtko

ตกลง; git apply --checkพูดpatch does not applyและgit apply -3พูดว่าrepository lacks the necessary blob to fall back on 3-way merge.ในคอมไพล์การทำซ้ำการกระทำเป็นเรื่องง่าย แต่คนจะรีบูตแพทช์ของพวกเขาที่ด้านบนของรหัสปรับปรุง?
ulidtko

1
@ulidtko อาจมีstackoverflow.com/a/15375869/6309หรือไม่
VonC

163
git apply name-of-file.patch

25
นี่อาจไม่ได้ตอบคำถามโดยละเอียดดั้งเดิม แต่ตอบคำถามในชื่อซึ่งเป็นสาเหตุที่ฉันอยู่ในหน้านี้ ขอบคุณ!
Rock Lee

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

1
git ใช้ "[... เส้นทางแบบเต็มไปยังไฟล์ ... ] / name-of-file.patch"
Anton Lyhin

41

หรือถ้าคุณเตะมันที่โรงเรียนเก่า:

cd /path/to/other/repository
patch -p1 < 0001-whatever.patch

3
เพียงแค่คุณทราบ: นั่นจะไม่สร้างความมุ่งมั่นดังนั้นมันจะสูญเสียข้อมูลการส่งข้อความและผู้เขียน
Caesar

22

ก่อนอื่นคุณควรจดบันทึกเกี่ยวกับความแตกต่างระหว่างgit amและgit apply

เมื่อคุณกำลังใช้git amคุณมักจะต้องการที่จะใช้แพทช์จำนวนมาก ดังนั้นควรใช้:

git am *.patch

หรือเพียงแค่:

git am

Git จะค้นหาแพตช์โดยอัตโนมัติและนำไปใช้ตามลำดับ ;-)

UPD ที่
นี่คุณสามารถค้นหาวิธีสร้างแพตช์ดังกล่าว


1
คำอธิบายความแตกต่างนี้ช่วยให้ฉันใช้git apply.. และใน--reverse:-) 👍
Jordan Gee


14

หากคุณใช้ JetBrains IDE (เช่น IntelliJ IDEA, Android Studio, PyCharm) คุณสามารถลากไฟล์แพตช์และวางมันลงใน IDE และไดอะล็อกจะปรากฏขึ้นเพื่อแสดงเนื้อหาของแพทช์ สิ่งที่คุณต้องทำตอนนี้คือคลิกที่ "ใช้ชุดข้อมูลแก้ไข" และการส่งมอบจะถูกสร้างขึ้น


1
ขอบคุณสำหรับสิ่งนี้. สิ่งนี้มีประโยชน์จริง ๆ สำหรับทุกคน มีคำตอบที่ยอมรับได้ แต่มันก็มีประโยชน์เช่นกัน
Lasitha Benaragama

1
@ambarox แต่คำตอบนี้ downvote ครั้งเดียวฉันไม่รู้ว่าทำไม
ice1000

1
อาจเป็นคนคิดว่าวิธีเดียวที่จะใช้แพทช์คือผ่านบรรทัดคำสั่ง : D ฉันให้คุณ upvote ไชโย
Lasitha Benaragama

1
@ LasithaBenaragama - ชนิดของ ดังนั้นไม่เพียงช่วย OP แต่ยังหมายถึงทุกคนที่ติดตามด้วย คำตอบนี้ (ในขณะที่มีประโยชน์) ไม่มีวิธีแก้ปัญหาทั่วไป นี่จะทำให้โพสต์บล็อกเล็ก ๆ น้อย ๆ ที่ยอดเยี่ยม แต่ไม่ใช่คำตอบที่ "ดี" จะอธิบาย downvote!
OldTinfoil

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