जवाबों:
एक पैच बनाने का सबसे आम तरीका 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, यह निर्भर करता है कि पैच का उत्पादन कैसे किया गया था।
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पहले से ही इसका उपयोग करने के सबसे सामान्य तरीके थे।
आदमी से:
-pnumया--strip=numपैच फ़ाइल में पाए जाने वाले प्रत्येक फ़ाइल नाम से संख्या में अग्रणी स्लैश वाले सबसे छोटे उपसर्ग को पट्टी करें। एक या एक से अधिक आसन्न स्लैश के अनुक्रम को एक स्लैश के रूप में गिना जाता है। यह नियंत्रित करता है कि पैच फ़ाइल में पाए गए फ़ाइल नाम का इलाज कैसे किया जाता है, यदि आप अपनी फ़ाइलों को पैच भेजने वाले व्यक्ति की तुलना में अलग निर्देशिका में रखते हैं। उदाहरण के लिए, पैच फ़ाइल में फ़ाइल का नाम रखना था:/u/howard/src/blurfl/blurfl.cसेटिंग
-p0पूरे फ़ाइल नाम को अनमॉडिफाइड ,-p1देता हैu/howard/src/blurfl/blurfl.cअग्रणी स्लैश के बिना ,
-p4देता हैblurfl/blurfl.c
अंतर यह है कि संख्या के बाद -pनिकाले जाने वाले पथ घटकों की संख्या निर्दिष्ट होगी।
कहो हमारे पास एक रास्ता है /Barack/Obama। के साथ इस पर एक पैच निष्पादित -p0तर्क पथ व्यवहार करेगा के रूप में :
/Barack/Obama
लेकिन हम पैचिंग करते समय पथ को ट्रिम कर सकते हैं:
-p1रूट स्लैश को हटा देगा (ध्यान दें कि यह अब केवल बराक होगा, इसके लिए कोई स्लैश नहीं बचा है):
Barack/Obama
-p2 बराक को हटा देगा (और समीपस्थ दाहिने स्लैश):
Obama
इस patchव्यवहार के "क्यों" पर विस्तार करने के लिए , इस थ्रेड को पढ़ें ।