เรียกใช้“ patch” โดยไม่สร้างไฟล์ * .orig และ * .rej


20

เป็นไปได้ไหมที่จะpatchไม่บอกให้สร้าง.origและ.rejไฟล์? ฉันพบว่ามันน่ารำคาญอย่างยิ่งที่โปรแกรมปะแก้สร้าง

คำตอบ:


14

หากคุณไม่ได้ให้ตัวเลือก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 ของคุณ


7

หากต้องการบอกให้ patch ไม่ให้ทำการสำรองข้อมูลเพียงแค่ละเว้น-bและ--backup-...ตัวเลือกใด ๆ

เพื่อแนะนำให้ไม่สร้างตัวเลือก.rejเพิ่มไฟล์ลง-r -ในคำสั่ง


4
สิ่งนี้ไม่ได้ผลสำหรับฉัน - เพียงแค่ทำให้การปฏิเสธในไฟล์ชื่อ "-" ซึ่งเป็นชื่อไฟล์ที่น่ารำคาญมาก ๆ ฉันใช้เวอร์ชั่น 2.5.8 บน Mac
rjmunro

ทำงานได้ดีGNU patch 2.6บน mac อาจลอง-r /dev/null
Stuart Cardall

3

--no-backup-if-mismatchตัวเลือกที่จะหลีกเลี่ยง ".orig" ไฟล์

คุณอาจต้องการลองใช้--mergeตัวเลือกซึ่งสร้างข้อขัดแย้งในไฟล์

ในทุกกรณีคุณควรมีวิธีที่จะกลับสู่สถานะที่ดีได้อย่างรวดเร็วหากการรวมเข้าครอบงำ


1

ผมติดอยู่กับแพทช์ v2.5.4 ที่ทำให้เกิดการสร้างปฏิเสธชื่อไฟล์-r --

ฉันพบว่า--reject-file=เช่นค่าว่างทำให้แพทช์ล้มเหลวด้วยรหัสออก2 หากพยายามเขียนไฟล์ปฏิเสธ หากไม่มีการปฏิเสธก็ใช้งานได้ตามที่คาดไว้ แม้ว่าจะไม่ใช่วิธีแก้ปัญหาที่สมบูรณ์สำหรับแพทช์รุ่นเก่า แต่ในบางกรณีอาจยอมรับหรือต้องการได้


0

สิ่งที่ดีที่สุดที่ฉันสามารถทำได้ (ใช้วิธีการกวาดสิ่งสกปรกใต้พรม) คือ-r <tmpfile>:

# patch -r /tmp/deleteme.rej -i patchfile filetobepatched

ตั้งแต่ใน v2.5.8 -r -จริง ๆ แล้วสร้าง-ไฟล์


-3

patch -p1 -B / dev / null -r - <file.patch


-1: นี่เป็นคำแนะนำที่แย่มาก ก่อนอื่น-Bแฟล็กไม่ได้ส่ง*.origเอาต์พุตไป/dev/nullตามที่ปรากฏจากคำสั่งของคุณ /dev/nullfoo.cppมันก็เกิดขึ้นที่ผู้ใช้ปกติไม่สามารถเขียนไฟล์ที่เรียกว่าสิ่งที่ต้องการ หากคุณทำสิ่งนี้ในฐานะรูทคุณจะได้รับขยะใน/devต้นไม้แทน ประการที่สอง-r -ไม่ระงับ*.rejไฟล์ มันก็ดูเหมือนจะทำเพราะข้อผิดพลาดเนื่องจากการปลอม-Bธงหยุดมันจากการแสดงให้คุณเห็นสิ่งที่มันจริงๆจะทำโดยไม่ต้อง-Bซึ่งเป็นสร้างไฟล์ชื่อ-ในไดเรกทอรีปัจจุบัน
Warren Young

1
@WarrenYoung ตามman patch: "-r ใส่การคัดลอกลงใน rejectfile แทนไฟล์. rej ที่เป็นค่าเริ่มต้นเมื่อ rejectfile คือ - ให้ยกเลิกการปฏิเสธ"
Limbo Peng
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.