ฉันจะใช้โปรแกรมแก้ไข -p0 จากไดเรกทอรีทำงานได้อย่างไร


26

ฉันมีแพทช์ที่มีเส้นทางที่แน่นอนที่ฉันต้องการใช้ เช่นสองสามบรรทัดแรกมีดังนี้

--- /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml  2014-10-10 18:47:23.000000000 +1100
+++ /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml.mod  2014-11-11 09:44:17.786200477 +1100

อย่างไรก็ตามมันล้มเหลวเว้นแต่ฉันอยู่ในไดเรกทอรีราก

~$ cd
~$ sudo patch -i /tmp/fix_kde_icons.patch -p0
Ignoring potentially dangerous file name /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml
Ignoring potentially dangerous file name /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml.mod
can't find file to patch at input line 3
Perhaps you used the wrong -p or --strip option?
...
~$ cd /tmp
/tmp$ sudo patch -i /tmp/fix_kde_icons.patch -p0
... #same error as above
/tmp$ cd /usr
/usr$ sudo patch -i /tmp/fix_kde_icons.patch -p0
... #same error as above
/usr$ cd /
/$ sudo patch -i /tmp/fix_kde_icons.patch -p0
patching file /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml

มีวิธีการpatchใช้เส้นทางสัมบูรณ์กับไดเรกทอรีการทำงานใด ๆ หรือไม่?


ฉันจะแก้ไขตัวแก้ไขแทน
Braiam

@Braiam ฉันจะแก้ไขเฉพาะสิ่งใดในการแก้ไขได้บ้าง ฉันสงสัยว่าฉันสามารถหลีกเลี่ยงการระบุเส้นทางเป้าหมายในpatchคำสั่งได้หรือไม่
Sparhawk

กรุณาบริบทบางอย่าง คุณกำลังพยายามใช้โปรแกรมแก้ไขนี้กับระบบที่ทำงานอยู่หรือไม่? ถ้าเป็นเช่นนั้นทำไม การกระจาย / OS ของคุณคืออะไร? แพทช์นี้ทำอะไร ดูเหมือนว่าแพทช์สำหรับสิ่งที่ KDE องค์ประกอบอะไร โดยทั่วไปถ้าคุณแจกจ่ายไม่ได้ใช้แพทช์สำหรับคุณคุณควรสร้างแพคเกจที่เกี่ยวข้องจากแหล่งที่มากับการใช้แพทช์ และคุณสามารถตัดส่วนที่เป็นผู้นำของเส้นทาง นั่นไม่ควรเป็นปัญหา จำนวนที่คุณตัดแต่งขึ้นอยู่กับว่าต้นฉบับมีลักษณะอย่างไร
Faheem Mitha

1
@FaheemMitha ใช่มันใช้งานได้ด้วย Arch / KDE มันจะแก้ไขข้อผิดพลาดนี้ การแก้ไขจะทำงานหากฉันใช้การเปลี่ยนแปลงด้วยตนเอง /tmp/fooแต่ผมไม่คิดว่าเรื่องบริบทมากในกรณีนี้ที่ผมสามารถทำซ้ำปัญหานี้มีไฟล์ทดสอบใน patchฉันสนใจในคำตอบทั่วไปที่นำไปใช้กับ
Sparhawk

คำตอบ:


35

ดูที่ซอร์สโค้ดของ GNU patch พฤติกรรมนี้ถูกสร้างขึ้นตั้งแต่รุ่น 2.7 ในฐานะของแพทช์ GNU 2.7.1 ยอมรับเฉพาะเส้นทางสัมพัทธ์ที่ไม่มี..อยู่เว้นแต่ว่าไดเรกทอรีปัจจุบันคือไดเรกทอรีราก

ในการใช้ชุดข้อมูลแก้ไขที่มีพา ธ สัมบูรณ์คุณสามารถใช้

(cd / && sudo patch -p0) <foo.patch

ใน GNU patch ล่าสุดคุณสามารถทำได้ง่ายๆ

sudo patch -d/ -p0 <foo.patch

โอเคมันคือสิ่งที่มันเป็น อย่างไรก็ตามหากคุณตรวจสอบคำสั่งของฉันcd /usrก็ล้มเหลวเช่นกันแม้จะมีไฟล์เป้าหมายที่อยู่ภายใต้ไดเรกทอรีนี้
Sparhawk

@Sparhawk ขออภัยคำอธิบายของฉันไม่ถูกต้องบางส่วน การทดสอบคือ: หากไดเรกทอรีปัจจุบันไม่ได้/ให้ปฏิเสธเส้นทางที่แน่นอนหรือเส้นทางที่มี..ส่วนประกอบ
Gilles 'หยุดความชั่วร้าย'

7
หรือมากกว่านั้นอย่างง่าย ๆsudo patch -d/ -p0 <foo.patch
เคียน

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