क्या यह एक पैच बनाने का एक अच्छा तरीका है?


15

मैं एक विशिष्ट gccशाखा से एक पैच बनाना चाहूंगा जो इसकी आधिकारिक रिलीज से तुलना करेगा; इसलिए जब मैं स्थिर रिलीज से टारबॉल को अनपैक करता हूं, तो मैं पैच को लागू कर सकता हूं और उस विशिष्ट शाखा में जो था, उसके बराबर प्राप्त कर सकता हूं।

यह पहली बार है जब मुझे एक पैच बनाने की आवश्यकता है, इसलिए यह मेरा पहली बार ऐसा कर रहा है और मेरी मुख्य चिंता यह है कि विकल्प और पार्सिंग सही हो जाए क्योंकि हम एक अत्यंत महत्वपूर्ण सॉफ्टवेयर के बारे में बात कर रहे हैं

diff -crB GccStable GccGit > /tmp/fromStabletoBranch.patch

क्या यह पर्याप्त और इसे करने का सबसे अच्छा तरीका है?


यहाँ की सामान्य अच्छी प्रथाओं में संस्करण नियंत्रण या इनमें से कुछ प्रकार शामिल हैं। इसमें मर्क्यूरियल, गिट और उनके संबंधित पैच कतार एक्सटेंशन शामिल हैं। आप रजाई पर भी विचार कर सकते हैं। शायद आप अधिक विस्तार में जा सकते हैं कि आप क्या करने की कोशिश कर रहे हैं?
फहीम मीठा

@FaheemMitha "अधिक विवरण" से आपका क्या तात्पर्य है? मेरे पास gccआधिकारिक स्थिर से एक संस्करण है tar.bz2और एक gitरिपॉजिटरी से एक और अस्थिर संस्करण है, मैं एक पैच बनाना चाहूंगा, बेशक मैं masterशाखा के खिलाफ तुलना करना चाहूंगा , न कि संपूर्ण रिपॉजिटरी से।
user2485710

ठीक है, ठीक है, यकीन है कि आप कुछ के रूप में सरल रूप में भिन्न का उपयोग कर सकते हैं। लेकिन संस्करण नियंत्रण का उपयोग करना आमतौर पर बेहतर होता है। एक बात के लिए, आप जो कर रहे हैं उसका ट्रैक खोना बहुत कठिन बना देता है।
फहीम मीठा

@FaheemMitha मुझे समझ नहीं आ रहा है कि आप क्या सुझाव दे रहे हैं, मेरा tar.bz2स्पष्ट रूप से एक gitरिपॉजिटरी नहीं है, आपको कैसे लगता है कि मुझे आगे बढ़ना चाहिए?
user2485710

1
"संस्करण नियंत्रण का उपयोग करके पैच बनाने" की खोज करें। पिछले दो उत्तर मैंने लिखे हैं जो संबंधित हैं unix.stackexchange.com/a/127810 और unix.stackexchange.com/a/139817
फहीम मीठा

जवाबों:


20

हां, पैच बनाने का यह एक अच्छा तरीका है।

संक्षेप में:

  1. एकल फ़ाइल के लिए पैच बनाने के लिए आपकी कमांड दिख सकती है

    diff -Naru file_original file_updated > file.patch

    कहाँ पे

    • -N: अनुपस्थित फ़ाइलों को खाली मानें
    • -a: सभी फाइलों को टेक्स्ट की तरह ट्रीट करें
    • -r: पुनरावर्ती किसी भी उपनिर्देशिका की तुलना करें
    • -u: आउटपुट NUM (डिफ़ॉल्ट 3) एकीकृत संदर्भ की लाइनें
  2. पूरी निर्देशिका के लिए पैच बनाने के लिए:

    diff -crB dir_original dir_updated > dfile.patch

    कहाँ पे

    • -c: आउटपुट NUM (डिफ़ॉल्ट 3) कॉपी किए गए संदर्भ की लाइनें
    • -r: पुनरावर्ती किसी भी उपनिर्देशिका की तुलना करें
    • -B: उन परिवर्तनों को अनदेखा करें जिनकी रेखाएँ सभी रिक्त हैं

आखिर इस पैच को लगाने के लिए कोई भी चला सकता है

patch -p1 --dry-run < dfile.patch

जहां स्विच pपैच को उपसर्ग पथ को पट्टी करने का निर्देश देता है ताकि फाइलों की सही पहचान हो सके। ज्यादातर मामलों में यह होना चाहिए 1

निकालें --dry-runयदि आप स्क्रीन पर मुद्रित परिणाम से खुश हैं।


प्रश्न: अगर dir_updatedवहाँ क्या था, तो निर्देशिका या फ़ाइल डिलीट होने से क्या होगा dir_original? diffभी इस बात का ध्यान रखती है या यह छोड़ दिया जाता है?
user2485710

@ user2485710 यह देखता है कि कौन सी फाइलें हटाई गईं। file.patchसिर्फ एक पाठ फ़ाइल में, ताकि आप इसे किसी भी संपादक में या सिर्फ catइसे खोल सकें और आपको एक पंक्ति दिखाई देगी जैसेonly in dir_original: missingfile.txt
jimmij

ठीक है, लेकिन फिर patchवह missingfile.txtया क्या हटा देगा ?
user2485710

निर्भर करता है। यदि आप उन्हें diff -N ...मेरे पहले उदाहरण के रूप में उपयोग करना चाहते हैं । आम तौर पर patchखाली फ़ाइलों को डिफ़ॉल्ट रूप से हटा देगा। यदि आप नहीं चाहते हैं, तो केवल diff -crBअपने प्रश्न के रूप में उपयोग करें। इसके अलावा कुछ (दुर्लभ) मामलों में -Eविकल्प patchको खाली फाइलों को हटाने के लिए पैच मैनुअल के बाद की जरूरत होती है:if the input is not a context diff or if patch is conforming to POSIX, patch does not remove empty patched files unless this option is given
जिमीज

मैं चला चुके diff -Naru dir/file dir/file.new > diff.patchहो रही can't find file to patch at input line 3के साथ patch -p0 --dry-run < diff.patchपैच की पहली पंक्ति पढ़ता --- dir/fileदूसरा एक +++ dir/file.newटाइमस्टैम्प के साथ, अंतर सिर्फ सही हो सकता है, लगता है कि कैसे के लिए सटीक फ़ाइल नाम आदेश दिखता रिपोर्ट किसी भी विकल्प है?
पोइटिका

0

यदि आप नवीनतम git checkin की तुलना किसी स्थिर संस्करण से करना चाहते हैं, तो बस जाएं git diff the-stable-version(यह पता लगाने की आवश्यकता होगी कि टैग क्या वर्णन करता है, शायद रिपॉजिटरी में सटीक संस्करण संख्या या कुछ संस्करण)। gitपरियोजना का पूरा इतिहास रखता है (आम तौर पर, बस एक हिस्से को हथियाने के तरीके हैं)। इससे कोई फर्क नहीं पड़ता कि the-stable-versionक्या कुछ अलग विकास शाखा में है (यानी, विकास बंद हो गया है और स्थिर शाखा को कुछ अंतिम मिनट फिक्स मिल गए हैं)।

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