เป็นไปได้หรือไม่ที่จะรู้ว่าไฟล์ได้รับการแพตช์แล้วก่อนที่จะใช้แพตช์?
ฉันต้องทำสิ่งนี้ในสคริปต์ความคิดใด ๆ
เป็นไปได้หรือไม่ที่จะรู้ว่าไฟล์ได้รับการแพตช์แล้วก่อนที่จะใช้แพตช์?
ฉันต้องทำสิ่งนี้ในสคริปต์ความคิดใด ๆ
คำตอบ:
ใช่เพียงแค่รันpatch
ด้วย--dry-run
ตัวเลือกอาจล้มเหลวหรือสำเร็จซึ่งสามารถพบได้ด้วยสถานะการออก
แต่โดยทั่วไป (และเกิดข้อผิดพลาดได้ง่ายขึ้น)คุณอาจต้องเปิดใช้งานด้วย-R
ตัวเลือกซึ่งแปลว่า "ย้อนกลับ" เนื่องจากจะสามารถย้อนกลับไปแก้ไขแพทช์ทั้งหมดได้ซึ่งถือว่าเป็น "ใช้" มิฉะนั้น (ไม่มี '-R') อาจล้มเหลวเนื่องจากบางส่วนของไฟล์ต้นฉบับมีการเปลี่ยนแปลง ด้านล่างเป็นตัวอย่างง่ายๆ:
if ! patch -R -p0 -s -f --dry-run <patchfile; then
patch -p0 <patchfile
fi
(ยิ่งไปกว่านั้นในตัวอย่างด้านบนคุณอาจต้องการปิดเสียงการpatch
เปลี่ยนเส้นทาง stdout และ stderr ไปอย่างสมบูรณ์/dev/null
)
-sf
ไปที่patch
(สามารถเขียนเป็นpatch -Rsfp0 --dry-run
)
ในกรณีที่มันช่วยใครบางคนถ้าคุณใช้ 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 ]
true
วัตถุประสงค์ในการถ้า แม่นยำเพราะคำสั่งส่วนใหญ่ใช้รหัสออกเป็น 0 เพื่อบ่งชี้ความสำเร็จ
นี่คือการเดาว่าคุณกำลังใช้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
ตัวเลือกซึ่งจะทำให้การสำรองข้อมูลเกิดขึ้น จากนั้นคุณตรวจสอบการมีอยู่ของการสำรองข้อมูล
nohup
ในif
กรณีนี้?
ในกรณีของฉันฉันต้องการตรวจสอบเพื่อที่ว่าการรันคำสั่ง patch จะไม่จบลงด้วยเทอร์มินัลแบบโต้ตอบเพื่อถามว่าจะทำอย่างไร
ปรากฎว่าหากคุณเพียงต้องการให้คุณสามารถใช้--forward
อาร์กิวเมนต์และมันจะข้ามแพทช์ถ้าใช้แล้ว!
สิ่งนี้ใช้ได้กับฉัน
"scripts": {
"symfony-scripts": [
"patch -N --silent -p0 < patches/vendor/somefile.js.patch &2>/dev/null",
"Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",