เป็นไปได้ไหมที่จะpatchไม่บอกให้สร้าง.origและ.rejไฟล์? ฉันพบว่ามันน่ารำคาญอย่างยิ่งที่โปรแกรมปะแก้สร้าง
เป็นไปได้ไหมที่จะpatchไม่บอกให้สร้าง.origและ.rejไฟล์? ฉันพบว่ามันน่ารำคาญอย่างยิ่งที่โปรแกรมปะแก้สร้าง
คำตอบ:
หากคุณไม่ได้ให้ตัวเลือกpatchอื่นใดนอกจาก-pNจะสร้างไฟล์เหล่านั้นเมื่อโปรแกรมแก้ไขไม่สามารถใช้งานได้อย่างสมบูรณ์
ดังนั้นหนึ่งทางเลือกคือการหยุดการสร้าง (หรือยอมรับ) แพทช์ที่ไม่ดี :)
ย้อนกลับไปในโลกแห่งความจริงนี่เป็นฟีเจอร์ เมื่อpatch(1)ล้มเหลวในการใช้ส่วนของโปรแกรมแก้ไขกับไฟล์ต้นฉบับมันจะบันทึกไฟล์ต้นฉบับชั่วคราวที่คัดลอกออกมาอย่างถาวรเป็น*.origทิ้งส่วนที่ถูกปฏิเสธไป*.rejแล้วและยังคงพยายามใช้ส่วนของโปรแกรมแก้ไขต่อไป แนวคิดคือคุณสามารถเปิด*.rejไฟล์และทำกระบวนการแก้ไขด้วยตนเองได้โดยการคัดลอกบิตและชิ้นส่วนไปยังไฟล์ที่ถูกแก้ไข *.origไฟล์ดังกล่าวยังมีประโยชน์เมื่อกระบวนการแพตช์ทำลายบางสิ่งโดยไม่ตั้งใจและคุณต้องอ้างถึงเวอร์ชันดั้งเดิมเพื่อแก้ไข
ฉันไม่ได้แก้ไขแพตช์ที่ไม่ดีพร้อมข้อความจาก*.rejและ*.origไฟล์ แต่มันก็ดีถ้ามีพวกมันในกรณีที่ฉันต้องการมัน
เมื่อฉันแก้ไขแพตช์ที่ไม่ดีฉันจะเรียกใช้สคริปต์ต่อไปนี้ที่รูทโปรเจ็กต์เพื่อล้างสิ่งต่าง ๆ อย่างรวดเร็ว:
#!/bin/bash
find . '(' \
-name \*-baseline -o \
-name \*-merge -o \
-name \*-original -o \
-name \*.orig -o \
-name \*.rej \
')' -delete
ฉันเรียกมันว่าcleanup-after-bad-patchเพราะชื่อยาวบางส่วนรับประกันว่าจะทำงานโดยไม่ได้ตั้งใจเพราะมันสามารถลบไฟล์ที่คุณยังต้องการได้ ตามจริงแล้วฉันมักจะรันมันโดยพิมพ์cleanTabEnterว่ามันเพียงพอที่จะค้นหาสคริปต์นี้ในPATHเครื่องพัฒนาของฉัน
รูปแบบเพิ่มเติมที่ตรวจสอบมีไว้สำหรับไฟล์ที่ส่งออกโดยระบบควบคุมเวอร์ชันที่ฉันเลือกเมื่อพบปัญหาเดียวกันระหว่างการดำเนินการผสาน คุณอาจต้องการปรับแต่งสำหรับเครื่องมือVCS / SCM ของคุณ
หากต้องการบอกให้ patch ไม่ให้ทำการสำรองข้อมูลเพียงแค่ละเว้น-bและ--backup-...ตัวเลือกใด ๆ
เพื่อแนะนำให้ไม่สร้างตัวเลือก.rejเพิ่มไฟล์ลง-r -ในคำสั่ง
GNU patch 2.6บน mac อาจลอง-r /dev/null
--no-backup-if-mismatchตัวเลือกที่จะหลีกเลี่ยง ".orig" ไฟล์
คุณอาจต้องการลองใช้--mergeตัวเลือกซึ่งสร้างข้อขัดแย้งในไฟล์
ในทุกกรณีคุณควรมีวิธีที่จะกลับสู่สถานะที่ดีได้อย่างรวดเร็วหากการรวมเข้าครอบงำ
ผมติดอยู่กับแพทช์ v2.5.4 ที่ทำให้เกิดการสร้างปฏิเสธชื่อไฟล์-r --
ฉันพบว่า--reject-file=เช่นค่าว่างทำให้แพทช์ล้มเหลวด้วยรหัสออก2 หากพยายามเขียนไฟล์ปฏิเสธ หากไม่มีการปฏิเสธก็ใช้งานได้ตามที่คาดไว้ แม้ว่าจะไม่ใช่วิธีแก้ปัญหาที่สมบูรณ์สำหรับแพทช์รุ่นเก่า แต่ในบางกรณีอาจยอมรับหรือต้องการได้
สิ่งที่ดีที่สุดที่ฉันสามารถทำได้ (ใช้วิธีการกวาดสิ่งสกปรกใต้พรม) คือ-r <tmpfile>:
# patch -r /tmp/deleteme.rej -i patchfile filetobepatched
ตั้งแต่ใน v2.5.8 -r -จริง ๆ แล้วสร้าง-ไฟล์
patch -p1 -B / dev / null -r - <file.patch
-Bแฟล็กไม่ได้ส่ง*.origเอาต์พุตไป/dev/nullตามที่ปรากฏจากคำสั่งของคุณ /dev/nullfoo.cppมันก็เกิดขึ้นที่ผู้ใช้ปกติไม่สามารถเขียนไฟล์ที่เรียกว่าสิ่งที่ต้องการ หากคุณทำสิ่งนี้ในฐานะรูทคุณจะได้รับขยะใน/devต้นไม้แทน ประการที่สอง-r -ไม่ระงับ*.rejไฟล์ มันก็ดูเหมือนจะทำเพราะข้อผิดพลาดเนื่องจากการปลอม-Bธงหยุดมันจากการแสดงให้คุณเห็นสิ่งที่มันจริงๆจะทำโดยไม่ต้อง-Bซึ่งเป็นสร้างไฟล์ชื่อ-ในไดเรกทอรีปัจจุบัน
man patch: "-r ใส่การคัดลอกลงใน rejectfile แทนไฟล์. rej ที่เป็นค่าเริ่มต้นเมื่อ rejectfile คือ - ให้ยกเลิกการปฏิเสธ"