วิธีใช้ 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นี่คือไกลโดยวิธีที่ง่ายที่สุดและปลอดภัยที่สุดในการใช้งาน คัดลอกไฟล์เป้าหมายของคุณไปยังโฟลเดอร์และแก้ไขโฟลเดอร์นั้น คัดลอกกลับเมื่อคุณพอใจที่กระบวนการแก้ไขเสร็จสิ้นโดยไม่มีข้อผิดพลาด