जांचें कि क्या फ़ाइल या फ़ोल्डर पहले से पैच किया गया है


22

क्या पैच को लागू करने से पहले यह जानना संभव है कि क्या किसी फ़ाइल को पहले ही पैच कर दिया गया है?

मुझे एक स्क्रिप्ट में यह करने की आवश्यकता है, कोई विचार?


1
आप उन्हें पैच करने के लिए किस कार्यक्रम का उपयोग कर रहे हैं? किस तरह के पैच?
सर्वव्यापी

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पूरी तरह से अपने स्टडआउट और स्टैडर को पुनर्निर्देशित करना पसंद कर सकते हैं /dev/null)


1
यह मेरे लिए काम नहीं करता है। जब मैं उस कमांड को चलाता हूं, यदि पैच लागू नहीं किया गया है, तो यह पूछता है कि क्या इंटरैक्टिव मोड में पैच को 'अन-रिवर्स' करना है और अगर मैं बैच मोड का उपयोग करता हूं, तो यह रिवर्स ऑपरेशन को नजरअंदाज कर देगा और पैच को लागू करेगा, 0 पर लौटेगा।
20

1
अरे, जोड़ने की कोशिश -sfकरने के लिए patch(के रूप में लिखा जा सकता है patch -Rsfp0 --dry-run)
poige

1
@synack क्या यह ठीक है?
9

16

बस अगर यह किसी की मदद करता है, यदि आप बैश स्क्रिप्ट का उपयोग कर रहे हैं, तो सर्वव्यापी द्वारा दिया गया उदाहरण काम नहीं करेगा। बैश में एक सफल कमांड का निकास स्थिति 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 सही है। यदि किसी कारणवश पैच लागू नहीं होना चाहिए, तो पैच-नॉन शून्य के साथ पैच बाहर निकल जाएगा।
Fl''Zen

मेरी स्क्रिप्ट बैश में सही थी। bash 0 के एक एक्जिट कोड को मानता trueहै, यदि वह प्रयोजनों के लिए है। सटीक रूप से क्योंकि अधिकांश कमांड सफलता को इंगित करने के लिए 0 के एक्जिट कोड का उपयोग करते हैं।
सर्वव्यापी

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 - मुझे याद नहीं है कि मैंने ऐसा क्यों किया। और जब तक मैंने देखा (एक संपादन अनुमोदन अनुरोध के कारण) कि यह वहां था, तो यह बहुत पहले था कोई मौका नहीं है कि मैं कभी भी इस कारण को पुनर्प्राप्त नहीं कर पा रहा हूं। यह अब मुझे देख कर काफी व्यर्थ लगता है।
सर्वव्यापी

0

मेरे मामले में मैं वह जाँच करना चाहता था ताकि पैच कमांड चलाना एक इंटरैक्टिव टर्मिनल के साथ समाप्त न हो जाए, जिसमें यह पूछा जाए कि क्या करना है (विशेषकर CI के लिए)।

पता चला है कि अगर आपको केवल जरूरत है कि आप --forwardतर्क का भी उपयोग कर सकते हैं और यह पैच को छोड़ देगा यदि पहले से ही लागू है!


0

यह मेरे काम आया।

"scripts": {
    "symfony-scripts": [
        "patch -N --silent -p0 < patches/vendor/somefile.js.patch &2>/dev/null",
        "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.