วิธีใช้ Patch กับไฟล์ (และสร้าง Patches) ใน Linux
patch
คำสั่งLinux ช่วยให้คุณถ่ายโอนการเปลี่ยนแปลงจากไฟล์ชุดหนึ่งไปยังไฟล์ชุดอื่นได้อย่างรวดเร็วและปลอดภัย เรียนรู้การใช้งานpatch
วิธีง่ายๆ
คำสั่ง patch และ diff
สมมติว่าคุณมีไฟล์ข้อความอยู่ในคอมพิวเตอร์ของคุณ คุณได้รับเวอร์ชันแก้ไขของไฟล์ข้อความนั้นจากบุคคลอื่น คุณถ่ายโอนการเปลี่ยนแปลงทั้งหมดจากไฟล์ที่แก้ไขไปยังไฟล์ต้นฉบับของคุณอย่างรวดเร็วได้อย่างไร นั่นคือที่มาpatch
และdiff
เข้ามามีบทบาท patch
และdiff
พบได้ใน Linux และระบบปฏิบัติการ Unix-Like อื่น ๆ เช่น macOS
diff
คำสั่งตรวจสอบสองรุ่นที่แตกต่างกันของไฟล์และรายการความแตกต่างระหว่างพวกเขา ความแตกต่างสามารถเก็บไว้ในไฟล์ที่เรียกว่าไฟล์แพทช์
patch
คำสั่งสามารถอ่านไฟล์แพทช์และใช้เนื้อหาเป็นชุดคำสั่ง การทำตามคำแนะนำเหล่านั้นการเปลี่ยนแปลงในไฟล์ที่แก้ไขจะถูกจำลองแบบในไฟล์ต้นฉบับ
ลองนึกภาพกระบวนการนั้นเกิดขึ้นกับไดเร็กทอรีไฟล์ข้อความทั้งหมด ทั้งหมดในครั้งเดียว patch
นั่นเป็นอำนาจของ
บางครั้งคุณไม่ได้รับการส่งไฟล์ที่แก้ไข สิ่งที่คุณได้รับคือไฟล์แพทช์ ทำไมต้องส่งไฟล์หลายสิบไฟล์ในเมื่อคุณสามารถส่งไฟล์เดียวหรือโพสต์ไฟล์เดียวเพื่อให้ดาวน์โหลดได้ง่าย
คุณทำอะไรกับไฟล์แพทช์เพื่อแก้ไขไฟล์ของคุณ? นอกเหนือจากการเกือบจะเป็นลิ้นจี่แล้วนั่นก็เป็นคำถามที่ดีเช่นกัน เราจะแนะนำคุณตลอดในบทความนี้
patch
คำสั่งที่ใช้บ่อยที่สุดโดยคนที่ทำงานกับไฟล์ต้นฉบับของซอฟต์แวร์รหัส แต่การทำงานอย่างเท่าเทียมกันได้ดีกับชุดของไฟล์ข้อความวัตถุประสงค์ใดซอร์สโค้ดของพวกเขาหรือไม่ใด ๆ
ที่เกี่ยวข้อง: วิธีเปรียบเทียบไฟล์ข้อความสองไฟล์ใน Linux Terminal
สถานการณ์ตัวอย่างของเรา
ในสถานการณ์นี้เราอยู่ในไดเร็กทอรีชื่อ work ซึ่งมีไดเร็กทอรีอื่นอีกสองไดเร็กทอรี หนึ่งเรียกว่าการทำงานและคนอื่น ๆ เรียกว่าล่าสุด ไดเร็กทอรีการทำงานมีชุดของไฟล์ซอร์สโค้ด ไดเร็กทอรีล่าสุดมีไฟล์ซอร์สโค้ดเวอร์ชันล่าสุดซึ่งบางไฟล์ได้รับการแก้ไขแล้ว
เพื่อความปลอดภัยไดเร็กทอรีการทำงานคือสำเนาของไฟล์ข้อความเวอร์ชันปัจจุบัน ไม่ใช่สำเนาเดียวของพวกเขา
การค้นหาความแตกต่างระหว่างไฟล์สองเวอร์ชัน
diff
คำสั่งพบความแตกต่างระหว่างสองไฟล์ การดำเนินการเริ่มต้นคือการแสดงรายการบรรทัดที่แก้ไขในหน้าต่างเทอร์มินัล
slang.c
แฟ้มหนึ่งที่เรียกว่า เราจะเปรียบเทียบเวอร์ชันในไดเร็กทอรีการทำงานกับเวอร์ชันในไดเร็กทอรีล่าสุด
-u
(ครบวงจร) ตัวเลือกที่บอกdiff
ไปยังรายการบางส่วนของการยกเลิกการปรับเปลี่ยนเส้นข้อความจากก่อนและหลังแต่ละส่วนมีการเปลี่ยนแปลง เส้นเหล่านี้เรียกว่าเส้นบริบท ช่วยให้ patch
คำสั่งระบุตำแหน่งที่ต้องทำการเปลี่ยนแปลงในไฟล์ต้นฉบับได้อย่างแม่นยำ
เราระบุชื่อของไฟล์เพื่อให้diff
ทราบว่าไฟล์ใดที่จะเปรียบเทียบ ไฟล์ต้นฉบับจะแสดงรายการก่อนจากนั้นไฟล์ที่แก้ไข นี่คือคำสั่งที่เราออกให้diff
:
diff -u working / slang.c ล่าสุด / slang.c
diff
สร้างรายการเอาต์พุตที่แสดงความแตกต่างระหว่างไฟล์ หากไฟล์เหมือนกันจะไม่มีเอาต์พุตอยู่ในรายการเลย การดูเอาต์พุตประเภทนี้จากการdiff
ยืนยันว่ามีความแตกต่างระหว่างไฟล์ทั้งสองเวอร์ชันและไฟล์ต้นฉบับต้องการการแก้ไข
การสร้าง Patch FIle
ในการจับความแตกต่างเหล่านั้นในไฟล์แพตช์ให้ใช้คำสั่งต่อไปนี้ เป็นคำสั่งเดียวกับด้านบนโดยเอาต์พุตจากการdiff
เปลี่ยนเส้นทางไปยังไฟล์ชื่อ slang.patch
diff -u working / slang.c ล่าสุด / slang.c> slang.patch
ชื่อของไฟล์แพตช์เป็นชื่อที่กำหนดเอง เรียกได้ว่าตามใจชอบ การให้นามสกุล“ .patch” เป็นความคิดที่ดี อย่างไรก็ตามเนื่องจากจะทำให้ชัดเจนว่าเป็นไฟล์ประเภทใด
ในการ patch
ดำเนินการกับไฟล์แพตช์และแก้ไขไฟล์ working / slang.c ให้ใช้คำสั่งต่อไปนี้ -u
(ครบวงจร) ตัวเลือกที่ช่วยให้patch
รู้ว่าไฟล์แพทช์มีสายบริบทแบบครบวงจร กล่าวอีกนัยหนึ่งเราใช้อ็อพชัน -u กับ diff ดังนั้นเราจึงใช้-u
ตัวเลือกกับpatch
.
patch -u working.slang.c -i slang.patch
หากทุกอย่างเป็นไปด้วยดีจะมีเอาต์พุตบรรทัดเดียวบอกว่าคุณpatch
กำลังแพตช์ไฟล์
การสำรองข้อมูลของ FIle ดั้งเดิม
เราสามารถสั่งpatch
ให้ทำสำเนาสำรองของไฟล์ที่ถูกแก้ไขก่อนที่จะมีการเปลี่ยนแปลงโดยใช้ -b
ตัวเลือก (สำรองข้อมูล) -i
(input) ตัวเลือกที่บอกว่าแพทช์ชื่อไฟล์แพทช์ในการใช้งาน:
แพทช์ -u -b working.slang.c -i slang.patch
ไฟล์ได้รับการแก้ไขเหมือนเดิมโดยไม่มีความแตกต่างในผลลัพธ์ อย่างไรก็ตามหากคุณดูในโฟลเดอร์ที่ใช้งานคุณจะเห็นไฟล์ที่เรียกว่า slang.c.orig ถูกสร้างขึ้น การประทับวันที่และเวลาของไฟล์แสดงว่า slang.c.orig เป็นไฟล์ต้นฉบับและ slang.c เป็นไฟล์ใหม่ที่สร้างโดยpatch
.
ใช้ต่างกับไดเรกทอรี
เราสามารถใช้diff
เพื่อสร้างไฟล์แพตช์ที่มีความแตกต่างทั้งหมดระหว่างไฟล์ในสองไดเร็กทอรี จากนั้นเราสามารถใช้ไฟล์แพตช์patch
นั้นเพื่อนำความแตกต่างเหล่านั้นไปใช้กับไฟล์ในโฟลเดอร์การทำงานด้วยคำสั่งเดียว
ตัวเลือกที่เราจะใช้diff
คือ-u
ตัวเลือก (บริบทรวม) ที่เราใช้ก่อนหน้านี้-r
ตัวเลือก (เรียกซ้ำ) เพื่อdiff
ดูไดเรกทอรีย่อยใด ๆ และ-N
ตัวเลือก (ไฟล์ใหม่)
-N
ตัวเลือกที่จะบอกdiff
วิธีการจัดการไฟล์ในไดเรกทอรีล่าสุดที่ไม่ได้อยู่ในไดเรกทอรีการทำงาน บังคับdiff
ให้ใส่คำแนะนำในไฟล์แพทช์เพื่อpatch
สร้างไฟล์ที่มีอยู่ในไดเร็กทอรีล่าสุด แต่หายไปจากไดเร็กทอรีการทำงาน
คุณสามารถรวมตัวเลือกเข้าด้วยกันเพื่อให้ใช้ยัติภังค์ ( -
) ตัวเดียว
โปรดทราบว่าเราระบุชื่อไดเร็กทอรีเท่านั้นเราไม่ได้บอกdiff
ให้ดูไฟล์เฉพาะ:
diff -ruN ทำงาน / ล่าสุด /> slang.patch
มองเข้าไปในไฟล์ Patch
มาดูไฟล์แพทช์กันอย่างรวดเร็ว เราจะใช้less
ดูเนื้อหา
ด้านบนของไฟล์แสดงความแตกต่างระหว่าง slang.c ทั้งสองเวอร์ชัน
เลื่อนลงไปด้านล่างผ่านไฟล์แพตช์เราจะเห็นว่ามันอธิบายการเปลี่ยนแปลงในไฟล์อื่นที่เรียกว่า structs.h นี่เป็นการยืนยันว่าไฟล์แพตช์มีความแตกต่างระหว่างไฟล์หลายเวอร์ชันอย่างแน่นอน
ดูก่อนที่คุณจะกระโดด
การแก้ไขคอลเลกชันไฟล์จำนวนมากอาจเป็นเรื่องที่น่าตกใจเล็กน้อยดังนั้นเราจะใช้--dry-run
ตัวเลือกเพื่อตรวจสอบว่าทุกอย่างเรียบร้อยดีก่อนที่เราจะกระโดดและมุ่งมั่นที่จะทำการเปลี่ยนแปลง
--dry-run
ตัวเลือกที่บอกpatch
จะทำทุกอย่างนอกเหนือจากการปรับเปลี่ยนจริงไฟล์ patch
จะทำการตรวจสอบไฟล์ก่อนการบินทั้งหมดและหากพบปัญหาใด ๆ จะรายงานให้ทราบ ไม่ว่าจะด้วยวิธีใดก็ตามจะไม่มีการแก้ไขไฟล์
หากไม่มีการรายงานปัญหาเราสามารถทำซ้ำคำสั่งโดยไม่ต้องใช้--dry-run
ตัวเลือกและแก้ไขไฟล์ของเราได้อย่างมั่นใจ
-d
(directory) ตัวเลือกที่บอกpatch
ไดเรกทอรีในการทำงานกับ
ทราบว่าเราไม่ได้ใช้-i
(input) ตัวเลือกที่จะบอกว่าไฟล์แพทช์มีคำแนะนำจากpatch
diff
แต่เรากำลังเปลี่ยนเส้นทางไฟล์แพทช์เข้ากับpatch
<
patch --dry-run -ruN -d ทำงาน <slang.patch
จากทั้งไดเร็กทอรีdiff
พบสองไฟล์ที่จะแก้ไข คำแนะนำเกี่ยวกับการแก้ไขสำหรับสองไฟล์นั้นได้รับการตรวจสอบโดยpatch
และไม่มีการรายงานปัญหาใด ๆ
การตรวจสอบก่อนบินก็ใช้ได้ เราพร้อมแล้วสำหรับการบินขึ้น
การแก้ไขไดเรกทอรี
ในการใช้แพตช์กับไฟล์อย่างแท้จริงเราใช้คำสั่งก่อนหน้าโดยไม่มี--dry-run
ตัวเลือก
แพทช์ -ruN -d ทำงาน <slang.patch
คราวนี้แต่ละบรรทัดของเอาต์พุตไม่ได้ขึ้นต้นด้วย "การตรวจสอบ" แต่ละบรรทัดจะเริ่มต้นด้วย "patching"
และไม่มีการรายงานปัญหาใด ๆ เราสามารถรวบรวมซอร์สโค้ดของเราและเราจะใช้ซอฟต์แวร์เวอร์ชันล่าสุด
ยุติความแตกต่างของคุณ
patch
นี่คือไกลโดยวิธีที่ง่ายที่สุดและปลอดภัยที่สุดในการใช้งาน คัดลอกไฟล์เป้าหมายของคุณไปยังโฟลเดอร์และแก้ไขโฟลเดอร์นั้น คัดลอกกลับเมื่อคุณพอใจที่กระบวนการแก้ไขเสร็จสิ้นโดยไม่มีข้อผิดพลาด