จะใช้แพตช์ 'git diff` ได้อย่างไรโดยไม่ต้องติดตั้ง Git?


280

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


4
ใครรู้วิธีการทำหากแพทช์รวมถึงการเปลี่ยนชื่อ? ตอนนี้แพตช์สนับสนุนแล้วหรือยัง?
Paul Crowley

3
คำถามที่ควรจะเป็น: มีวิธีการใช้ git diff โดยไม่ต้องติดตั้ง git หรือไม่? ตามที่ระบุไว้ด้านล่าง , patchไม่สนับสนุนรูปแบบนี้
Aryeh Leib Taurog

คำตอบ:


425
git diff > patchfile

และ

patch -p1 < patchfile

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


แก้ไขธันวาคม 2558

รุ่นล่าสุดของpatchคำสั่ง (2.7 ได้รับการปล่อยตัวในเดือนกันยายน 2012) สนับสนุนคุณลักษณะส่วนใหญ่ของรูปแบบ "ต่าง --git" รวมทั้งเปลี่ยนชื่อและสำเนาสิทธิ์ในการเปลี่ยนแปลงและ diffs symlink ( แต่ยังไม่ได้ diffs binary) ( ปล่อยประกาศ )

ดังนั้นหากมีใครใช้รุ่นปัจจุบัน / ล่าสุดpatchไม่จำเป็นต้องใช้gitเพื่อให้สามารถใช้ diff เป็นแพทช์ได้


97
หรือใช้git diff > patchfileแต่patch -p1 < patchfile
Jakub Narębski

11
หากคุณต้องการสร้าง patchfile ของพา ธ ย่อยของที่เก็บคุณสามารถใช้relativeตัวเลือกเช่น:git diff --no-prefix --relative=my/relative/path > patchfile
Koen

2
patch -p1 < patchfileไม่จำเป็นต้องมีการติดตั้งคอมไพล์ คำสั่งแรกแสดงให้เห็นถึงคำสั่งสำหรับการสร้างความแตกต่างไม่ได้ใช้มัน
Andrey Kuznetsov

1
แพทช์ที่สร้างขึ้นสำหรับการเปลี่ยนแปลงจากสาขา / refspec ที่ระบุไว้ในคำสั่งไปยังสาขาในปัจจุบันหรือการใช้งาน ในคำอื่น ๆ ที่คุณต้องการgit diff from_branch > patchfile; git checkout from_branch; git patch -p1 < patchfileหรือgit diff from_branch to_branch > patchfile; ...
hobs

1
@PaulChechetin อย่างที่ egor83 พูดในคำตอบของ suppie มันจะทับในตอนแรก
Andrey Kuznetsov

75

ลองนี้:

patch -p1 < patchfile

4
อาร์กิวเมนต์ -p1 ทำหน้าที่อะไร
chrisjlee

8
ลอกทับในตอนแรก ดูman patch
egor83

16
@chrisjlee git diffจะใส่a/และb/นำหน้าในเอาต์พุตดังนั้นให้patch -p1ละทิ้งผู้ที่จะใช้ไฟล์ปะแก้
wberry

49

ใช้

git apply patchfile

ถ้าเป็นไปได้.

patch -p1 < patchfile 

มีผลข้างเคียงที่อาจเกิดขึ้น

git applyจัดการกับไฟล์ที่เพิ่มลบและเปลี่ยนชื่อหากอธิบายในgit diffรูปแบบซึ่งpatchจะไม่ทำ สุดท้ายgit applyคือรูปแบบ "ใช้ทั้งหมดหรือยกเลิกทั้งหมด" ซึ่งทุกอย่างถูกนำไปใช้หรือไม่มีอะไรในขณะที่โปรแกรมแก้ไขสามารถใช้ไฟล์แพทช์บางส่วนทำให้ไดเรกทอรีทำงานของคุณอยู่ในสถานะแปลก


1
+1 คำตอบที่มีเหตุผลเท่านั้น ยิ่งไปกว่านั้น diff / patch จะไม่จัดการ symlink ซึ่งเป็นปัญหาถ้า (ตัวอย่าง) คุณกำลังคืนค่า 3.10 Linux kernel patch
Ignis

10
ใช่git applyเป็นวิธีที่ดีที่สุดที่จะทำ แต่คำถามนี้โดยเฉพาะถามวิธีการใช้แพทช์โดยไม่ต้องติดตั้ง Git
Colin D Bennett

1
ตัวเลือก--dry-run --verboseมีประโยชน์ในการพิจารณาว่ามีผลข้างเคียงอะไรบ้างถ้ามี (ใช้ patch v2.5.8)
spyle

@ignis - " git apply patchfile -... คำตอบที่มีเหตุผลเพียงอย่างเดียว ... " - เกือบเป็นเรื่องที่น่าหัวเราะ ทุกครั้งที่ OpenSSL devs ส่งแพตช์ให้ฉันทดสอบ Git ไม่สามารถใช้มันได้ นั่นคือทุกครั้ง ฉันยังไม่เห็นว่าเครื่องมือโง่ ๆ ใช้โปรแกรมปะแก้
jww


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