जब पैचिंग करें तो तर्कों के बीच अंतर क्या है -p0 और -p1?


19

बीच क्या अंतर है patch -p0और patch -p1?

क्या कोई अंतर है?

जवाबों:


23

एक पैच बनाने का सबसे आम तरीका diffकमांड या कुछ संस्करण नियंत्रण के अंतर्निहित-समान कमांड को चलाना है diff। कभी-कभी, आप केवल दो फ़ाइलों की तुलना कर रहे हैं, और आप diffइस तरह से चलते हैं:

diff -u version_by_alice.txt version_by_bob.txt >alice_to_bob.patch

तब आपको एक पैच मिलता है जिसमें एक फ़ाइल के लिए परिवर्तन होते हैं और इसमें फ़ाइल का नाम बिल्कुल नहीं होता है। जब आप उस पैच को लागू करते हैं, तो आपको यह निर्दिष्ट करना होगा कि आप इसे किस फ़ाइल पर लागू करना चाहते हैं:

patch <alice_to_bob.patch version2_by_alice.txt

अक्सर, आप एक निर्देशिका में निहित एक पूरी मल्टी-फ़ाइल परियोजना के दो संस्करणों की तुलना कर रहे हैं। diffइस तरह दिखता है की एक विशिष्ट आह्वान :

diff -ru old_version new_version >some.patch

फिर पैच में फ़ाइल नाम होते हैं, जैसे हेडर लाइनों में दिए गए diff -ru old_version/dir/file new_version/dir/file। आपको फ़ाइल नाम से patchउपसर्ग ( old_versionया new_version) को स्ट्रिप करने के लिए बताने की आवश्यकता है । इसका -p1मतलब है: निर्देशिका का एक स्तर पट्टी।

कभी-कभी, पैच में हेडर लाइनों में सीधे बिना किसी लीड-अप के फ़ाइल नाम होता है। यह संस्करण नियंत्रण प्रणालियों के साथ आम है; उदाहरण के लिए cvs diffहेडर लाइनों का उत्पादन करता है जो दिखते हैं diff -r1.42 foo। फिर पट्टी करने के लिए कोई उपसर्ग नहीं है, इसलिए आपको निर्दिष्ट करना होगा -p0

विशेष स्थिति में जब आपके द्वारा तुलना किए जा रहे पेड़ों में कोई उपनिर्देशिका नहीं है, तो कोई -pविकल्प आवश्यक नहीं है: patchफ़ाइल नामों के सभी निर्देशिका भाग को छोड़ देगा। लेकिन ज्यादातर समय, आपको -p0या तो ज़रूरत होती है या -p1, यह निर्भर करता है कि पैच का उत्पादन कैसे किया गया था।


इसने मुझे इतने लंबे समय तक भ्रमित किया है। कोई उपनिर्देशिका का व्यवहार -p0 से अलग क्यों है? मैंने हमेशा यह माना है कि -p0 डिफ़ॉल्ट था, इसलिए मेरे पास हमेशा मुद्दे थे अगर इसे p0 माना जाता था
ब्रायडन गिब्सन

@BrydonGibson मुझे संदेह है कि मूल रूप से यह विचार था कि पैच लेखक उदासीनता से लिख सकता है diff old/foo new/foo >my.patchया diff ../old/foo foo >my.patchया diff foo.old foo >my.patchसकता है और उपयोगकर्ता इसे लागू कर सकता है patch <my.patchबिना परवाह किए कि कैसे पैच का उत्पादन किया गया था, और फिर -pएक सुविधा के रूप में जोड़ा गया था। लेकिन मैं वास्तव में नहीं जानता, patchएक पुरानी उपयोगिता है और जब तक मैंने इसका उपयोग शुरू किया -p0या -p1पहले से ही इसका उपयोग करने के सबसे सामान्य तरीके थे।
गिलेस एसओ- बुराई को रोकें '

16

आदमी से:

-pnum या --strip=num पैच फ़ाइल में पाए जाने वाले प्रत्येक फ़ाइल नाम से संख्या में अग्रणी स्लैश वाले सबसे छोटे उपसर्ग को पट्टी करें। एक या एक से अधिक आसन्न स्लैश के अनुक्रम को एक स्लैश के रूप में गिना जाता है। यह नियंत्रित करता है कि पैच फ़ाइल में पाए गए फ़ाइल नाम का इलाज कैसे किया जाता है, यदि आप अपनी फ़ाइलों को पैच भेजने वाले व्यक्ति की तुलना में अलग निर्देशिका में रखते हैं। उदाहरण के लिए, पैच फ़ाइल में फ़ाइल का नाम रखना था:

 /u/howard/src/blurfl/blurfl.c

सेटिंग -p0पूरे फ़ाइल नाम को अनमॉडिफाइड , -p1देता है

 u/howard/src/blurfl/blurfl.c

अग्रणी स्लैश के बिना , -p4देता है

 blurfl/blurfl.c

4

अंतर यह है कि संख्या के बाद -pनिकाले जाने वाले पथ घटकों की संख्या निर्दिष्ट होगी।

कहो हमारे पास एक रास्ता है /Barack/Obama। के साथ इस पर एक पैच निष्पादित -p0तर्क पथ व्यवहार करेगा के रूप में :

/Barack/Obama

लेकिन हम पैचिंग करते समय पथ को ट्रिम कर सकते हैं:

-p1रूट स्लैश को हटा देगा (ध्यान दें कि यह अब केवल बराक होगा, इसके लिए कोई स्लैश नहीं बचा है):

Barack/Obama

-p2 बराक को हटा देगा (और समीपस्थ दाहिने स्लैश):

 Obama

इस patchव्यवहार के "क्यों" पर विस्तार करने के लिए , इस थ्रेड को पढ़ें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.