เมื่อทำการปะแก้ข้อแตกต่างระหว่างอาร์กิวเมนต์ -p0 และ -p1 คืออะไร


19

ความแตกต่างระหว่างpatch -p0และpatch -p1คืออะไร

มีความแตกต่างหรือไม่?

คำตอบ:


23

วิธีที่ใช้กันมากที่สุดในการสร้างแพทช์คือการใช้diffคำสั่งหรือบางตัวอยู่ในการควบคุมของรุ่นdiffเหมือนคำสั่ง บางครั้งคุณเพิ่งเปรียบเทียบไฟล์สองไฟล์และคุณเรียกใช้diffดังนี้:

diff -u version_by_alice.txt version_by_bob.txt >alice_to_bob.patch

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

patch <alice_to_bob.patch version2_by_alice.txt

บ่อยครั้งที่คุณเปรียบเทียบสองโครงการหลายไฟล์ทั้งหมดที่มีอยู่ในไดเรกทอรี คำขอทั่วไปของdiffลักษณะเช่นนี้:

diff -ru old_version new_version >some.patch

diff -ru old_version/dir/file new_version/dir/fileแล้วแพทช์ที่มีชื่อไฟล์ที่ได้รับในสายหัวเช่น คุณต้องบอกpatchให้ตัดส่วนนำหน้า ( old_versionหรือnew_version) ออกจากชื่อไฟล์ นั่นคือความ-p1หมาย: ดึงไดเรกทอรีหนึ่งระดับออก

บางครั้งบรรทัดส่วนหัวในแพตช์มีชื่อไฟล์โดยตรงโดยไม่ต้องรอคอย นี่เป็นเรื่องปกติกับระบบควบคุมเวอร์ชัน ตัวอย่างเช่นผู้ผลิตสายหัวที่มีลักษณะเหมือนcvs diff จากนั้นก็มีคำนำหน้าแถบไม่ดังนั้นคุณจะต้องระบุdiff -r1.42 foo-p0

ในกรณีพิเศษเมื่อไม่มีไดเรกทอรีย่อยในทรีที่คุณกำลังเปรียบเทียบไม่มี-pตัวเลือกที่จำเป็น: patchจะยกเลิกส่วนไดเรกทอรีทั้งหมดของชื่อไฟล์ แต่ส่วนใหญ่คุณต้องการ-p0หรืออย่างใดอย่างหนึ่ง-p1ขึ้นอยู่กับวิธีการผลิตแพทช์


สิ่งนี้ทำให้ฉันสับสนมานาน ทำไมพฤติกรรมของไม่มีไดเรกทอรีย่อยต่างจาก -p0 ฉันคิดเสมอว่า -p0 เป็นค่าเริ่มต้นดังนั้นฉันมักจะมีปัญหาเสมอถ้ามันควรจะเป็น p0
Brydon Gibson

@BrydonGibson ฉันสงสัยว่าเดิมแล้วความคิดก็คือผู้เขียนโปรแกรมแก้ไขสามารถเขียนอย่างไม่สนใจdiff old/foo new/foo >my.patchหรือdiff ../old/foo foo >my.patchหรือdiff foo.old foo >my.patchและผู้ใช้สามารถใช้งานได้patch <my.patchโดยไม่ต้องสนใจว่าจะมีการผลิตโปรแกรมแก้ไขอย่างไรจากนั้น-pจึงเพิ่มความสะดวกสบาย แต่ฉันไม่รู้จริง ๆ แล้วว่าpatchเป็นยูทิลิตี้เก่าและเมื่อฉันเริ่มใช้มัน-p0หรือ-p1เป็นวิธีที่ใช้บ่อยที่สุดแล้ว
Gilles 'หยุดชั่วร้าย'

16

จากคน:

-pnum หรือ --strip=num Strip ส่วนนำหน้าที่เล็กที่สุดที่มี slash นำ NUM จากชื่อไฟล์แต่ละชื่อที่พบในไฟล์แพตช์ ลำดับของสแลชหนึ่งรายการหรือมากกว่าที่อยู่ติดกันถูกนับเป็นสแลชเดี่ยว วิธีนี้จะควบคุมวิธีปฏิบัติต่อชื่อไฟล์ที่พบในไฟล์แพตช์ในกรณีที่คุณเก็บไฟล์ไว้ในไดเรกทอรีที่แตกต่างจากบุคคลที่ส่งแพตช์ออกมา ตัวอย่างเช่นสมมติว่าชื่อไฟล์ในไฟล์แพทช์คือ:

 /u/howard/src/blurfl/blurfl.c

การตั้งค่า-p0ให้ชื่อไฟล์ทั้งหมดยังไม่แปร , -p1ให้

 u/howard/src/blurfl/blurfl.c

โดยไม่ต้องเฉือนชั้นนำ , -p4ให้

 blurfl/blurfl.c

4

ความแตกต่างคือจำนวนหลังจากนั้น-pจะระบุจำนวนขององค์ประกอบของเส้นทางที่จะถูกลบออก

/Barack/Obamaบอกว่าเรามีเส้นทาง การดำเนินการแก้ไขบนมันด้วย-p0อาร์กิวเมนต์จะถือว่าเส้นทางเป็น :

/Barack/Obama

แต่เราสามารถตัดแต่งเส้นทางในขณะทำการปะ:

-p1จะลบเครื่องหมายสแลช (โปรดทราบว่าเพิ่งจะเป็นบารักคตอนนี้โดยไม่ต้องใช้เครื่องหมายสแลชเหลืออยู่):

Barack/Obama

-p2 จะลบ Barack (และเครื่องหมายทับขวาติดกัน):

 Obama

หากต้องการขยายการ "ทำไม" ของpatchพฤติกรรมนี้อ่านหัวข้อนี้

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