ตรวจสอบว่าไฟล์หรือโฟลเดอร์ได้รับการแก้ไขแล้ว


22

เป็นไปได้หรือไม่ที่จะรู้ว่าไฟล์ได้รับการแพตช์แล้วก่อนที่จะใช้แพตช์?

ฉันต้องทำสิ่งนี้ในสคริปต์ความคิดใด ๆ


1
คุณใช้โปรแกรมอะไรในการแก้ไข แพทช์ประเภทใด
Omnifarious

1
กุญแจสำคัญคือ "-R" - unix.stackexchange.com/a/86872/6622
poige

คำตอบ:


20

ใช่เพียงแค่รันpatchด้วย--dry-runตัวเลือกอาจล้มเหลวหรือสำเร็จซึ่งสามารถพบได้ด้วยสถานะการออก

แต่โดยทั่วไป (และเกิดข้อผิดพลาดได้ง่ายขึ้น)คุณอาจต้องเปิดใช้งานด้วย-Rตัวเลือกซึ่งแปลว่า "ย้อนกลับ" เนื่องจากจะสามารถย้อนกลับไปแก้ไขแพทช์ทั้งหมดได้ซึ่งถือว่าเป็น "ใช้" มิฉะนั้น (ไม่มี '-R') อาจล้มเหลวเนื่องจากบางส่วนของไฟล์ต้นฉบับมีการเปลี่ยนแปลง ด้านล่างเป็นตัวอย่างง่ายๆ:

if ! patch -R -p0 -s -f --dry-run <patchfile; then
  patch -p0 <patchfile
fi

(ยิ่งไปกว่านั้นในตัวอย่างด้านบนคุณอาจต้องการปิดเสียงการpatchเปลี่ยนเส้นทาง stdout และ stderr ไปอย่างสมบูรณ์/dev/null)


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

1
เฮ้ลองเพิ่ม-sfไปที่patch(สามารถเขียนเป็นpatch -Rsfp0 --dry-run)
poige

1
@Synack มันโอเคมั้ย
poige

16

ในกรณีที่มันช่วยใครบางคนถ้าคุณใช้ bash script แล้วตัวอย่างที่ Omnifarious ให้ไว้ก็ไม่ทำงาน ในทุบตีสถานะออกของคำสั่งที่ประสบความสำเร็จคือ 0

ดังนั้นต่อไปนี้จะได้ผล:

patch -p0 -N --dry-run --silent < patchfile 2>/dev/null
#If the patch has not been applied then the $? which is the exit status 
#for last command would have a success status code = 0
if [ $? -eq 0 ];
then
    #apply the patch
    patch -p0 -N < patchfile
fi

การตรวจสอบควรผิด1แทนที่จะเป็น0:if [ $? -eq 1 ]
Crisson

2
ไม่ 0 ถูกต้อง โปรแกรมแก้ไขจะออกโดยไม่เป็นศูนย์หากการรันแบบแห้งล้มเหลวด้วยเหตุผลบางอย่างซึ่งในกรณีนี้ไม่ควรใช้โปรแกรมแก้ไข
Fls'Zen

สคริปต์ของฉันถูกต้องในทุบตี bash ถือว่ารหัสการออกเป็น 0 เพื่อtrueวัตถุประสงค์ในการถ้า แม่นยำเพราะคำสั่งส่วนใหญ่ใช้รหัสออกเป็น 0 เพื่อบ่งชี้ความสำเร็จ
Omnifarious

2

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

if patch <options> -N --dry-run --silent <patchfile 2>/dev/null; then
    echo The file has not had the patch applied,
    echo and the patch will apply cleanly.
else
    echo The file may not have had the patch applied.
    echo Or maybe the patch doesn't apply to the file.
fi

หรือหากคุณแพตช์ไฟล์ก่อนและต้องการทราบว่ามันแตะไฟล์บางไฟล์หรือไม่คุณสามารถเรียกใช้แพทช์แรกด้วย-Bตัวเลือกซึ่งจะทำให้การสำรองข้อมูลเกิดขึ้น จากนั้นคุณตรวจสอบการมีอยู่ของการสำรองข้อมูล
เตอร์

8
คุณช่วยขยายความหน่อยได้ไหมว่าทำไมคุณถึงเลือกใช้nohupในifกรณีนี้?
zrajm

@zrajm - ฉันจำไม่ได้ว่าทำไมฉันถึงทำอย่างนั้น และตามเวลาที่ฉันสังเกตเห็น (เนื่องจากคำขออนุมัติการแก้ไข) ว่ามีอยู่เมื่อนานมาแล้วไม่มีโอกาสที่ฉันจะกู้คืนเหตุผลได้ ดูเหมือนว่าฉันจะมองมันไร้ประโยชน์แล้ว
Omnifarious

0

ในกรณีของฉันฉันต้องการตรวจสอบเพื่อที่ว่าการรันคำสั่ง patch จะไม่จบลงด้วยเทอร์มินัลแบบโต้ตอบเพื่อถามว่าจะทำอย่างไร

ปรากฎว่าหากคุณเพียงต้องการให้คุณสามารถใช้--forwardอาร์กิวเมนต์และมันจะข้ามแพทช์ถ้าใช้แล้ว!


0

สิ่งนี้ใช้ได้กับฉัน

"scripts": {
    "symfony-scripts": [
        "patch -N --silent -p0 < patches/vendor/somefile.js.patch &2>/dev/null",
        "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.