क्या यह संभव है कि patchजनरेट .origऔर .rejफाइल्स न बताएं ? मुझे यह बहुत कष्टप्रद लगता है कि पैच इन बनाता है।
क्या यह संभव है कि patchजनरेट .origऔर .rejफाइल्स न बताएं ? मुझे यह बहुत कष्टप्रद लगता है कि पैच इन बनाता है।
जवाबों:
यदि आप इसके patchअलावा कोई विकल्प नहीं दे रहे हैं -pN, तो यह केवल उन फ़ाइलों को बनाता है जब एक पैच साफ-साफ लागू करने में विफल रहता है।
तो, एक विकल्प खराब पैच बनाने (या स्वीकार करने) को रोकना है। :)
वास्तविक दुनिया में वापस, यह एक विशेषता है। जब patch(1)पैच फ़ाइल को मूल फ़ाइल में लागू करने में विफल रहता है, तो यह अस्थायी मूल फ़ाइल कॉपी को बाहर की तरह सहेजता है *.orig, अस्वीकार किए गए खंड को डंप करता है *.rej, और पैच खंडों को लागू करने का प्रयास जारी रखता है। विचार यह है कि आप *.rejफ़ाइल को खोल सकते हैं और पैच फ़ाइल पर बिट्स और टुकड़ों की प्रतिलिपि बनाकर पैच प्रक्रिया को मैन्युअल रूप से पूरा कर सकते हैं । *.origफ़ाइल भी उपयोगी है जब पैच प्रक्रिया गलती से कुछ जहाजों हो सकता है और आप मूल संस्करण का उल्लेख करने के लिए इसे ठीक करने के लिए की जरूरत है।
मैं हमेशा *.rejऔर *.origफ़ाइलों से पाठ के साथ एक खराब पैच को ठीक नहीं करता, लेकिन मुझे उनकी आवश्यकता होने पर उन्हें करना अच्छा लगता है।
एक बार जब मैंने खराब पैच को ठीक कर लिया, तो मैं प्रोजेक्ट रूट पर निम्नलिखित स्क्रिप्ट को जल्दी से साफ करने के लिए चलाता हूं:
#!/bin/bash
find . '(' \
-name \*-baseline -o \
-name \*-merge -o \
-name \*-original -o \
-name \*.orig -o \
-name \*.rej \
')' -delete
मैं इसे फोन करता हूं cleanup-after-bad-patchक्योंकि लंबे समय से नाम इस दुर्घटना को चलाने के खिलाफ आंशिक रूप से बीमा करता है, क्योंकि यह उन फ़ाइलों को हटा सकता है जिनकी आपको अभी भी आवश्यकता है। ईमानदार होने के लिए, हालांकि, मैं आमतौर पर इसे टाइप करके चलाता हूं cleanTabEnter, जो कि PATHमेरे विकास मशीनों पर इस स्क्रिप्ट को खोजने के लिए पर्याप्त है ।
जब यह जाँच करता है तो अतिरिक्त पैटर्न मेरे पसंद के संस्करण नियंत्रण प्रणाली द्वारा फाइल आउटपुट के लिए होता है जब यह एक मर्ज ऑपरेशन के दौरान समान समस्या का सामना करता है। आप इसे अपने VCS / SCM टूल के लिए समायोजित करना चाह सकते हैं ।
पैच को बताने के लिए बैकअप का उत्पादन न करें -bऔर किसी भी --backup-...विकल्प को छोड़ दें ।
यह निर्देश के लिए .rejफाइल नहीं बनाने के लिए निर्देश के लिए -r -विकल्प जोड़ें ।
GNU patch 2.6मैक पर ठीक काम कर शायद कोशिश-r /dev/null
--no-backup-if-mismatchविकल्प ".orig" फ़ाइलें नहीं आने देगा।
आप --mergeविकल्प को आज़माना भी चाह सकते हैं , जो एक इन-फ़ाइल संघर्ष बनाता है।
सभी मामलों में आपके पास किसी तरह से जल्दी से एक अच्छी स्थिति में वापस आने का रास्ता होना चाहिए यदि मर्ज भारी हो जाता है।
मैं पैच v2.5.4 के साथ फंस गया हूं, जहां -r -इसका कारण नाम की फाइलों को अस्वीकार करना है -।
मैंने पाया कि --reject-file=खाली मान के कारण एक्ज़िट कोड के साथ पैच फेल हो जाता है। 2 यदि यह रिजेक्ट फाइल लिखने की कोशिश करता है। यदि कोई अस्वीकृति नहीं है तो यह अपेक्षित रूप से काम करता है। हालांकि पैच के पुराने संस्करण के लिए पूर्ण समाधान नहीं है, कुछ परिस्थितियों में यह स्वीकार्य या वांछित हो सकता है।
सबसे अच्छा मैं (रग के तहत गंदगी स्वीप करने का एक तरीका) के साथ आ सकता है -r <tmpfile>, अर्थात:
# patch -r /tmp/deleteme.rej -i patchfile filetobepatched
चूंकि v2.5.8, -r -वास्तव में -फ़ाइल बनाता है ।
पैच -p1 -B / dev / null -r - <file.patch
-Bध्वज *.origआउटपुट को नहीं भेजता है /dev/null, क्योंकि यह आपकी कमांड से प्रकट होता है। यह सिर्फ ऐसा होता है कि सामान्य उपयोगकर्ता फाइलों को नहीं लिख सकते हैं जैसे कि चीजें /dev/nullfoo.cpp। यदि आप इसे जड़ के रूप में करते हैं, तो आपको /devइसके बदले कबाड़ मिल जाएगा । दूसरा, फ़ाइल को -r -दबाता नहीं है *.rej। यह केवल ऐसा करता प्रतीत होता है क्योंकि फर्जी -Bध्वज के कारण त्रुटि आपको यह दिखाने से रोकती है कि यह वास्तव में इसके बिना क्या करेगा -B, जो -वर्तमान निर्देशिका में नामक एक फ़ाइल बनाता है ।
man patch: "-r ने डिफ़ॉल्ट .rej फ़ाइल के बजाय अस्वीकृत में अस्वीकार कर दिया है। जब अस्वीकृति है - अस्वीकार को छोड़ें।"