जवाबों:
एक पैच बनाने का सबसे आम तरीका 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
व्यवहार के "क्यों" पर विस्तार करने के लिए , इस थ्रेड को पढ़ें ।