นี่เป็นวิธีที่ดีในการสร้างแพตช์หรือไม่?


15

ฉันต้องการสร้างแพทช์จากgccสาขาที่เฉพาะเจาะจงเปรียบเทียบกับการวางจำหน่ายอย่างเป็นทางการ ดังนั้นเมื่อฉันนำ tarball ออกจากการวางจำหน่ายที่เสถียรฉันสามารถใช้ตัวแก้ไขและรับสิ่งที่เทียบเท่าในสาขานั้น

นี่เป็นครั้งแรกที่ฉันต้องสร้างแพตช์ดังนั้นมันเป็นครั้งแรกที่ฉันทำสิ่งนี้และสิ่งที่ฉันกังวลหลักคือการหาตัวเลือกและการแยกวิเคราะห์ที่ถูกต้องเนื่องจากเรากำลังพูดถึงซอฟต์แวร์ที่สำคัญอย่างยิ่ง

diff -crB GccStable GccGit > /tmp/fromStabletoBranch.patch

นี่เป็นวิธีที่ดีที่สุดและเพียงพอหรือไม่


แนวปฏิบัติที่ดีตามปกติที่นี่เกี่ยวข้องกับการควบคุมเวอร์ชันหรือตัวแปรบางประการ ซึ่งรวมถึง Mercurial, git และส่วนขยายคิวการแก้ไขที่เกี่ยวข้อง คุณสามารถพิจารณาผ้านวม บางทีคุณอาจเข้าไปดูรายละเอียดเพิ่มเติมว่าคุณกำลังพยายามทำอะไร?
Faheem Mitha

@FaheemMitha คุณหมายถึงอะไรกับ "รายละเอียดเพิ่มเติม" ฉันมีรุ่นจากรุ่นgccที่เป็นทางการtar.bz2และรุ่นที่ไม่เสถียรจากที่gitเก็บฉันต้องการสร้างแพทช์แน่นอนว่าฉันต้องการเปรียบเทียบกับmasterสาขาไม่ใช่ที่เก็บทั้งหมด
user2485710

ตกลงดีแน่ใจว่าคุณสามารถใช้บางอย่างที่เรียบง่ายต่างกัน แต่โดยทั่วไปแล้วการใช้การควบคุมเวอร์ชันจะดีกว่า สำหรับสิ่งหนึ่งมันทำให้ยากที่จะสูญเสียการติดตามสิ่งที่คุณทำ
Faheem Mitha

@FaheemMitha ฉันไม่เข้าใจสิ่งที่คุณกำลังแนะนำฉันtar.bz2ไม่ชัดเจนที่gitเก็บฉันคิดว่าฉันควรดำเนินการต่อไปอย่างไร
user2485710

1
ทำการค้นหา "การสร้างแพตช์โดยใช้การควบคุมเวอร์ชัน" คำตอบก่อนหน้านี้สองคำตอบที่ฉันเขียนซึ่งมีความเกี่ยวข้องคือunix.stackexchange.com/a/127810และunix.stackexchange.com/a/139817
Faheem Mitha

คำตอบ:


20

ใช่นี่เป็นวิธีที่ดีในการสร้างแพทช์

ในระยะสั้น:

  1. เพื่อสร้างแพทช์สำหรับไฟล์เดียวคำสั่งของคุณอาจมีลักษณะ

    diff -Naru file_original file_updated > file.patch

    ที่ไหน

    • -N: ถือว่าไฟล์ที่หายไปนั้นว่างเปล่า
    • -a: ถือว่าไฟล์ทั้งหมดเป็นข้อความ
    • -r: เปรียบเทียบไดเรกทอรีย่อยที่พบซ้ำ ๆ
    • -u: เอาต์พุต NUM (3 ค่าเริ่มต้น) ของบริบทแบบรวม
  2. วิธีสร้างแพตช์สำหรับไดเรกทอรีทั้งหมด:

    diff -crB dir_original dir_updated > dfile.patch

    ที่ไหน

    • -c: เอาต์พุต NUM (3 ค่าเริ่มต้น) ของบริบทที่คัดลอก
    • -r: เปรียบเทียบไดเรกทอรีย่อยซ้ำ ๆ
    • -B: ละเว้นการเปลี่ยนแปลงที่บรรทัดว่างทั้งหมด

หลังจากทั้งหมดเพื่อใช้โปรแกรมแก้ไขนี้อย่างใดอย่างหนึ่งสามารถเรียกใช้

patch -p1 --dry-run < dfile.patch

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

ลบ--dry-runหากคุณมีความสุขจากผลลัพธ์ที่พิมพ์บนหน้าจอ


คำถาม: สิ่งที่ควรจะเกิดขึ้นถ้าไดเรกทอรีหรือไฟล์ที่ถูกลบในdir_updatedเมื่อเทียบกับสิ่งที่มีอยู่ในdir_original? diffดูแลที่มากเกินไปหรือได้รับการข้าม?
2485710

@ user2485710 diff เห็นว่าไฟล์ใดถูกลบ file.patchในเพียงไฟล์ข้อความดังนั้นคุณสามารถเปิดในโปรแกรมแก้ไขใด ๆ หรือเพียงแค่catมันและคุณจะเห็นบรรทัดเช่นonly in dir_original: missingfile.txt
jimmij

ตกลง แต่patchจะลบออกmissingfile.txtหรืออะไรอย่างอื่น?
user2485710

มันขึ้นอยู่กับ. หากคุณต้องการที่จะลบพวกเขาใช้diff -N ...ในตัวอย่างแรกของฉัน โดยปกติpatchจะลบไฟล์เปล่าโดยปริยาย หากคุณไม่ต้องการเพียงใช้diff -crBในคำถามของคุณเท่านั้น นอกจากนี้ใน-Eตัวเลือกบางกรณี (หายาก) ในpatchคำสั่งเป็นสิ่งจำเป็นในการลบไฟล์ที่ว่างเปล่าหลังจากคู่มือการแก้ไข:if the input is not a context diff or if patch is conforming to POSIX, patch does not remove empty patched files unless this option is given
jimmij

ผมเคยทำงานdiff -Naru dir/file dir/file.new > diff.patchรับcan't find file to patch at input line 3กับpatch -p0 --dry-run < diff.patchบรรทัดแรกของแพทช์อ่าน--- dir/fileคนที่สอง+++ dir/file.newกับการประทับเวลาต่างน่าจะเป็นเพียงขวาจะมีตัวเลือกวิธีการรายงานชื่อไฟล์ที่แน่นอนคำสั่งลักษณะหา?
ptica

0

หากคุณต้องการเปรียบเทียบการตรวจสอบคอมไพล์ล่าสุดกับเวอร์ชันเสถียรบางตัวเพียงไปgit diff the-stable-version(จะต้องคิดว่าแท็กใดอธิบายถึงหมายเลขที่แน่นอนหรือตัวแปรบางตัว) ในที่เก็บ gitเก็บประวัติทั้งหมดของโครงการไว้ (โดยปกติมีวิธีที่จะคว้าเพียงส่วนหนึ่ง) ไม่สำคัญว่าthe-stable-versionจะอยู่ในสาขาการพัฒนาที่แตกต่างกันหรือไม่ (เช่นการพัฒนาแยกออกจากกันและสาขาที่มั่นคงได้รับการแก้ไขในนาทีสุดท้าย)

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