git: patch ใช้ไม่ได้


289

ฉันมีแพทช์บางตัวที่เรียกว่า my_pcc_branch.patch

เมื่อฉันพยายามที่จะใช้มันฉันได้รับข้อความต่อไปนี้:

$ git apply --check my_pcc_branch.patch
warning: src/main/java/.../AbstractedPanel.java has type 100644, expected 100755
error: patch failed: src/main/java/.../AbstractedPanel.java:13
error: src/main/java/.../AbstractedPanel.java: patch does not apply

มันหมายความว่าอะไร?

ฉันจะแก้ไขปัญหานี้ได้อย่างไร


มีไฟล์ AbstractedPanel.java.rej อยู่แถว ๆ นี้หรือไม่? โดยทั่วไปนี่หมายความว่าบอตไลน์เปลี่ยนไปในแหล่งที่มาและในแพทช์ (ที่นี่บรรทัดที่ 13 ดูเหมือนว่าจะได้รับผลกระทบ)
ฤดี

ไม่ฉันไม่พบไฟล์ * .rej ใด ๆ
Dmitrii Pisarenko

ไม่แน่ใจว่าทำไมคำตอบที่ยอมรับจะแก้ไขได้ (ดังนั้นฉันสงสัยว่ามันเป็นปลาเฮอริ่งแดง) แต่ไม่ได้has type 100644, expected 100755หมายความว่ามีการอนุญาต chmod ไม่ตรงกันที่ไหนสักแห่ง?
ruffin

คำตอบ:


325

git apply --reject --whitespace=fix mychanges.patch ทำงานให้ฉัน

คำอธิบาย

--rejectตัวเลือกที่จะสั่งคอมไพล์จะไม่ล้มเหลวถ้ามันไม่สามารถกำหนดวิธีการที่จะใช้แพทช์ แต่แทนที่จะนำไปใช้ hunks indivdual มันสามารถนำไปใช้และสร้างปฏิเสธไฟล์ ( .rej) สำหรับ hunks มันไม่สามารถใช้ Wiggleสามารถ "ใช้แพทช์ที่ถูกปฏิเสธ [เหล่านี้] และแสดงคำที่แตกต่างได้"

นอกจากนี้--whitespace=fixจะเตือนเกี่ยวกับข้อผิดพลาดของช่องว่างและพยายามแก้ไขแทนที่จะปฏิเสธที่จะใช้ก้อนใหญ่ที่เกี่ยวข้อง

ตัวเลือกทั้งสองร่วมกันทำให้แอปพลิเคชันของโปรแกรมแก้ไขมีประสิทธิภาพมากขึ้นต่อความล้มเหลว แต่พวกเขาต้องการความสนใจเพิ่มเติมเกี่ยวกับผลลัพธ์

สำหรับเอกสารทั้งหมดดูhttps://git-scm.com/docs/git-apply


8
สิ่งนี้ใช้ได้ผลดีกว่าสำหรับฉันเพราะมันไม่ได้แก้ไขไฟล์ของฉันอย่างสมบูรณ์
Wayne Werner

10
มันเยี่ยมมาก เพียงแค่ปฏิเสธสิ่งที่ไม่สามารถแก้ปัญหาได้เองจากนั้นคุณสามารถแก้ไขไฟล์ที่ถูกปฏิเสธได้ด้วยตนเอง
Dennis

1
patch -p1 <mychanges.patch # ใช้การเปลี่ยนแปลงอันก้อนโดยอัน หากการเปลี่ยนแปลงล้มเหลวจะมีการสร้าง <sourcefile> .orig และ <sourcefile> .rej และคุณสามารถใช้การเปลี่ยนแปลงด้วยตนเอง ฉันเดา git ใช้ --reject ทำแบบเดียวกันและ --whitespace = fix ดีกว่าอย่างน่าอัศจรรย์
gaoithe

7
คำสั่งนี้สร้าง.rejไฟล์เมื่อไม่สามารถตรวจพบวิธีการใช้โปรแกรมแก้ไขโดยอัตโนมัติ คุณสามารถใช้กระดิกเพื่อแก้ไขปัญหาดังกล่าว
goodniceweb

14
คำตอบนี้ไม่ได้อธิบายอะไรเลยโดยเฉพาะในกรณีที่มันจะทำงาน ผู้คนคุณต้องมีคุณภาพของคำตอบที่ต้องการมากขึ้นจริง ๆ นี่ไม่ใช่ฟอรัม
โอลิเวอร์

319

Johannes Sixt จากรายชื่อผู้รับจดหมาย msysgit@googlegroups.com แนะนำโดยใช้อาร์กิวเมนต์บรรทัดคำสั่งต่อไปนี้:

git apply --ignore-space-change --ignore-whitespace mychanges.patch

นี่เป็นการแก้ไขปัญหาของฉัน


25
ใครช่วยฉันได้บ้างและอธิบายว่าทำไมสิ่งนี้ถึงได้ผล คำตอบอื่น ๆ ไม่ได้ผลสำหรับฉันและฉันมีปัญหาเดียวกันกับที่ผู้ถามคำถามอธิบาย แอตทริบิวต์ของไฟล์เกี่ยวข้องกับการละเว้นช่องว่างหรือไม่
skrebbel

1
การใช้ windows powershell มีการใช้โปรแกรมแก้ไขที่ทำด้วย git diff ดังนี้ git diff HEAD..613fee - myfile.xml | git ใช้ --ignore-space-change --ignore-whitespace ในขณะที่การบันทึกเอาต์พุต diff แบบแรกเป็นไฟล์ไม่ทำงานในกรณีที่ทุกคนพบปัญหาเดียวกัน
tjb

2
ลอง-C1เปลี่ยนเป็นใช้เพื่อลดบริบทรอบ ๆ สิ่งที่สำคัญ
อาเมียร์อาลีอั

2
@EricWalker เวทย์มนตร์คอมไพล์ด้วย CR / LF ไม่จำเป็นต้องเป็นสิ่งที่เลวร้าย ทางเลือกอาจเป็นครึ่งหนึ่งของเซ็ตการแก้ไขของคุณประกอบด้วยทุกบรรทัดเดียวในทุกไฟล์ที่แตะถูกเปลี่ยนจากบรรทัดหนึ่งที่ลงท้ายด้วยอีกบรรทัดหนึ่งโดยมีการเปลี่ยนแปลงจริงฝังอยู่ที่ไหนสักแห่งที่อยู่ตรงกลาง
jwg

3
สิ่งนี้ช่วยได้บ้าง แต่บางครั้งฉันก็ยังได้รับ "แพทช์ไม่ได้ใช้" แม้ว่าแพทช์ควรใช้โดยไม่มีปัญหา
Thomas Levesque

118

เมื่อทุกคนอื่นล้มเหลวลองgit apply's--3wayตัวเลือก

git apply --3way patchFile.patch

- 3way
เมื่อแพทช์ไม่ได้ใช้อย่างหมดจดถอยกลับไปบน 3-way ผสานถ้าแพทช์บันทึกข้อมูลประจำตัวของ blobs มันควรจะนำไปใช้และเรามี blobs เหล่านั้นที่มีอยู่ในท้องถิ่นอาจทิ้งเครื่องหมายขัดแย้งในไฟล์ใน แผนผังการทำงานสำหรับผู้ใช้ที่จะแก้ไข ตัวเลือกนี้แสดงถึงตัวเลือก - ดัชนีและเข้ากันไม่ได้กับ - ปฏิเสธและตัวเลือก - แคช

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


2
นี่คือคำตอบที่เหมาะกับฉัน ไฟล์ที่ฉันกำลังแก้ไขไม่ได้สะท้อนการเปลี่ยนแปลงที่ฉันสร้างแพทช์จาก (เพราะฉันลบการเปลี่ยนแปลงหลังจากที่ฉันสร้างแพทช์)
Christia

3
วิธีแก้ปัญหาทั่วไปที่ดี ความแตกต่างของ 3way ดูไม่เหมือนปกติแล้วมันก็สับสนเล็กน้อย แต่ก็ไม่เคยน้อยเลยที่ทำให้ฉันสามารถแก้ไขข้อขัดแย้งและนำ patch มาใช้
steinybot

8
ฉันคิดว่านี่--3wayเป็นพฤติกรรมเริ่มต้น เมื่อการแพตช์ล้มเหลวอย่างน้อยก็บอกฉันว่าอะไรที่ล้มเหลวเพื่อให้ฉันสามารถแก้ไขด้วยตนเองได้ git applyเพิ่งล้มเหลวและไม่รายงานสาเหตุที่เกิดข้อผิดพลาด ฉันไม่สามารถแม้แต่จะค้นหา*.rejไฟล์เหมือนที่hgสร้างขึ้นได้
Pavan Manjunath

4
ทางออกที่ดีที่สุดแน่นอน ให้ผู้ใช้แก้ไขข้อขัดแย้งของตัวเอง!
Mosh Feu

56

คำสั่งนี้จะใช้ชุดข้อมูลแก้ไขโดยไม่แก้ไขปัญหาโดยปล่อยให้ไฟล์ไม่ดีเป็น*.rej:

git apply --reject --whitespace=fix mypath.patch

คุณเพียงแค่ต้องแก้ไขพวกเขา เมื่อแก้ไขแล้วให้เรียกใช้:

git -am resolved

7
วิธีแก้ไข*.rej- ทั้งหมดที่ฉันสามารถหาได้คือทำการเปลี่ยนแปลงด้วยตนเองในไฟล์ต้นฉบับ & ลบ.rejไฟล์เหล่านี้ มีวิธีอื่นอีกไหม?
coding_idiot

1
@coding_idiot ตามปกติเพียงแค่ตรวจสอบไฟล์. rej เปรียบเทียบกับไฟล์ที่ขัดแย้งกันและในที่สุดก็เพิ่มไฟล์คงที่ในดัชนี (ด้วย "git เพิ่ม FIXED_FILES")
Ivan Voroshilin

2
@coding_idiot คุณสามารถใช้wiggleเพื่อแก้ไขได้ ตัวอย่างเช่นwiggle --replace path/to/file path/to/file.rej. คำสั่งนี้จะใช้การเปลี่ยนแปลงจาก.rejไฟล์เป็นไฟล์ต้นฉบับ path/to/file.porigนอกจากนี้ยังสร้างสำเนาของไฟล์ต้นฉบับเช่น กรุณาเอกสารการชำระเงินเพื่อรับข้อมูลเพิ่มเติมเกี่ยวกับ wiggle
goodniceweb

22

ลองใช้วิธีแก้ปัญหาที่แนะนำที่นี่: https://www.drupal.org/node/1129120

patch -p1 < example.patch

สิ่งนี้ช่วยฉัน


3
ฉันรู้ว่าคุณไม่ควรทำเช่นนี้ แต่ขอบคุณมาก! ช่วยฉันชั่วโมง ฉันได้รับ "แพทช์ใช้ไม่ได้" และข้อผิดพลาดทุกประเภท
sudo rm -rf slash

@ sudorm-rfslash ทำไมเราไม่ควรทำเช่นนี้และทำไมคุณถึงทำเช่นนั้น?
ดำ

git: 'patch' is not a git command.ongit version 2.21.1 (Apple Git-122.3)
Sridhar Sarnobat

16

มันเกิดขึ้นเมื่อคุณผสมไคลเอนต์คอมไพล์ UNIX และ Windows เนื่องจาก Windows ไม่มีแนวคิดของ "x" บิตดังนั้นการเช็คเอาต์rw-r--r--ไฟล์ (0644) ของคุณภายใต้ Windows คือ "เลื่อน" โดยเลเยอร์ msys POSIXrwx-r-xr-x (0755) . git ถือว่าความแตกต่างของโหมดนั้นโดยทั่วไปเหมือนกับความแตกต่างของข้อความในไฟล์ดังนั้นแพทช์ของคุณจึงไม่สามารถใช้งานได้โดยตรง ผมคิดว่าตัวเลือกที่ดีของคุณเท่านั้นที่นี่คือการตั้งค่าcore.filemodeที่จะfalse(ใช้git-config)

นี่คือปัญหา msysgit พร้อมข้อมูลที่เกี่ยวข้องบางส่วน: http://code.google.com/p/msysgit/issues/detail?id=164 (เปลี่ยนเส้นทางไปเป็นสำเนา copy.org 3 ธันวาคม 2013 ของ archive.org


2
ฉันพยายามเรียกใช้คำสั่ง "git config core.filemode false" แต่ก็ไม่ได้ช่วยอะไรฉันยังคงได้รับข้อความเดิม
Dmitrii Pisarenko

สมมติว่าคุณไม่มีการเปลี่ยนแปลงที่ยังไม่ได้ทำไว้ในโครงสร้างพยายามgit reset --hard HEADบังคับให้ git ทำการเช็คเอาต์ไฟล์ของคุณอีกครั้งโดยใช้ตัวเลือกใหม่
เบ็คแจ็คสัน

เพิ่งลองใช้งานเรียกใช้ "รีเซ็ต git - ฮาร์ดหัว" มันประสบความสำเร็จ (ฉันเห็นข้อความ "HEAD is at at ... ") แต่ปัญหาของ "git Apply" ยังคงมีอยู่
Dmitrii Pisarenko

7

ในกรณีของฉันฉันโง่พอที่จะสร้างไฟล์แพตช์ไม่ถูกต้องตั้งแต่แรกจริงๆแล้วมันผิดในทางที่ผิดทางที่ผิด ฉันลงเอยด้วยข้อความแสดงข้อผิดพลาดเดียวกัน

หากคุณเป็นผู้เชี่ยวชาญและทำ git diff branch-name > branch-name.patchนี้จะพยายามลบส่วนเพิ่มเติมทั้งหมดที่คุณต้องการให้เกิดขึ้นและในทางกลับกัน (ซึ่งเป็นไปไม่ได้ที่คอมไพล์จะสำเร็จเนื่องจากเห็นได้ชัดว่าไม่สามารถลบส่วนเพิ่มเติมที่ไม่ได้ทำ)

เพื่อให้แน่ใจว่าคุณเช็คเอาต์ไปยังสาขาของคุณและดำเนินการ git diff master > branch-name.patch


3

คำเตือน: คำสั่งนี้สามารถลบการสูญเสียเก่ากระทำอย่างถาวร ทำสำเนาของที่เก็บข้อมูลทั้งหมดของคุณก่อนลองทำสิ่งนี้

ฉันพบลิงค์นี้แล้ว

ฉันไม่รู้ว่าทำไมงานนี้ แต่ฉันลองทำงานหลายอย่างและนี่เป็นงานเดียวที่เหมาะกับฉัน ในระยะสั้นเรียกใช้สามคำสั่งด้านล่าง:

git fsck --full
git reflog expire --expire=now --all
git gc --prune=now

3
นี่เป็นคำสั่งที่อันตรายมากที่สามารถลบการสูญเสียเก่าที่กระทำไปตลอดกาลจาก reflog หาก repo ของคุณอยู่ในสถานะสั่นคลอนอย่าใช้สิ่งนี้
ET

0

สิ่งที่ฉันมองหาไม่ได้ชี้ให้เห็นอย่างชัดเจนที่นี่ใน SO ฉันเขียนเพื่อประโยชน์ของผู้อื่นที่อาจค้นหาคล้ายกัน ฉันประสบปัญหากับไฟล์หนึ่งไฟล์ (มีอยู่ใน repo เก่า) การลบออกใน repo และเมื่อฉันใช้ชุดข้อมูลแก้ไขมันล้มเหลวเนื่องจากไม่พบไฟล์ที่จะนำไปใช้ (ดังนั้นกรณีของฉันคือ git patch ไม่สามารถลบไฟล์ได้) '#git Apply --reject' ให้มุมมอง แต่ฉันไม่ได้รับการแก้ไข ฉันไม่สามารถใช้กระดิกได้เพราะเราไม่สามารถใช้งานได้ในเซิร์ฟเวอร์การสร้างของเรา ในกรณีของฉันฉันได้รับปัญหานี้โดยการลบรายการของ 'ไฟล์ที่ถูกลบใน repo' จากไฟล์ patch ที่ฉันได้ลองใช้ดังนั้นฉันได้รับการเปลี่ยนแปลงอื่น ๆ ทั้งหมดที่นำไปใช้โดยไม่มีปัญหา (ใช้ 3 วิธีผสานหลีกเลี่ยง ข้อผิดพลาด white space) จากนั้นผสานเนื้อหาของไฟล์ที่ถูกลบด้วยตนเองไปยังตำแหน่งที่ย้าย


0

ปัญหาของฉันคือฉันวิ่งgit diffแล้ววิ่งgit reset --hard HEADจากนั้นฉันก็รู้ว่าต้องการเลิกทำดังนั้นฉันจึงพยายามคัดลอกเอาต์พุตจากgit diffไฟล์และใช้git applyงาน แต่ฉันพบข้อผิดพลาดว่า "โปรแกรมแก้ไขใช้ไม่ได้" หลังจากที่เปลี่ยนไปpatchและพยายามที่จะใช้มันฉันตระหนักว่าก้อน diff ซ้ำด้วยเหตุผลบางอย่างและหลังจากลบที่ซ้ำกัน , patch(และคงจะยังgit apply) ทำงาน

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