पैच बनाएँ या गिट रिपॉजिटरी से फ़ाइल को अलग करें और इसे किसी अन्य भिन्न गिट रिपॉजिटरी में लागू करें


155

मैं वर्डप्रेस आधारित परियोजना पर काम करता हूं और मैं WP के प्रत्येक नए रिलीज संस्करण में अपनी परियोजना को पैच करना चाहता हूं। इसके लिए, मैं दो कमिट या टैग के बीच एक पैच उत्पन्न करना चाहता हूं।

उदाहरण के लिए, मेरे रेपो में /www/WPमैं ऐसा करता हूं:

$git patch-format com1..com2 --stdout > ~/patchs/mypatch.patch

या

$git patch-format tag1..tag2 --stdout > ~/patchs/mypatch.patch

/www/WP git natif वर्डप्रेस

/www/myproject मेरा git प्रोजेक्ट वर्डप्रेस आधारित है

git applyकमांड लाइन से काम नहीं करता, मुझे लगता है कि क्योंकि हम अलग खजाने में हैं।

क्या मैं एक कमिट के बिना एक पैच फ़ाइल उत्पन्न कर सकता हूं, बस एक अंतर और इसे दूसरे गिट रिपॉजिटरी में लागू कर सकता हूं?

अग्रिम धन्यवाद।

जवाबों:


243

आप इसके लिए उपयुक्त एकीकृतgit diff उत्पादन का उपयोग कर सकते हैं :git apply

git diff tag1..tag2 > mypatch.patch

आप इसके बाद परिणामी पैच को लागू कर सकते हैं:

git apply mypatch.patch

1
धन्यवाद एरिको, मैंने इस्तेमाल किया $git diff -u tag1..tag2 > mypatch.patchऔर $git apply --stat > mypatch.patchजवाब 0 files changedकृपया कोई अन्य सुझाव है? :)
जटामाइन

आपको पैच फ़ाइल के तर्क के रूप में पथ निर्दिष्ट करना होगा git apply। मैंने एक उदाहरण के साथ अपना उत्तर अपडेट किया।
एनरिको कैंपिडोग्लियो

1
मैंने इस्तेमाल किया git diff -p tag1 tag2 > my.patchजो अच्छा काम किया।
बार्कले

मैं एकीकृत अलग प्रारूप में पैच कैसे बना सकता हूं? sourceware.org/glibc/wiki/… कहते हैं, Only unified diff (-uNr) format is acceptable.लेकिन जब मैं कोशिश करता git diff -uNr tag1..tag2 > mypatch.patchहूं तो मुझे संदेश मिलता हैusage: git diff [<options>] [<commit> [<commit>]] [--] [<path>...]
हारून

2
सावधान रहें git diff ...+ git apply ...हटाए गए / स्थानांतरित फ़ाइलों को ठीक से हैंडल न करें ... जब git format-patch ...+ git am ...करें।
vrince

50

कई आवागमन के लिए पैच का उत्पादन करने के लिए, आपको format-patchgit कमांड का उपयोग करना चाहिए , जैसे

git format-patch -k --stdout R1..R2

यह मेलबॉक्स फॉर्मेट में आपके कमेंट्स को पैच फाइल में एक्सपोर्ट करेगा।

अंतिम प्रतिबद्ध के लिए पैच उत्पन्न करने के लिए, रन करें:

git format-patch -k --stdout HEAD^

फिर एक और रिपॉजिटरी में amgit कमांड द्वारा पैच लागू करते हैं , जैसे

git am -3 -k file.patch

देखें: man git-format-patchऔर git-am


1
उस पैच के बारे में क्या जो के साथ लागू किया जा सकता है patch -p1? sourceware.org/glibc/wiki/…
एरॉन फ्रेंक

मैं लिनक्स से वाइनड्यूज़ में पैच ले रहा था, इसलिए --ignore-whitespace का उपयोग करना था जैसा कि यहां बताया गया है stackoverflow.com/questions/13190679/…
महेश

2
@AaronFranke, आप '-p' विकल्प आज़मा सकते हैं: git format-patch -p HEAD ^ 1
Piroxiljin

ध्यान दें, इसमें मूल संदेशों के प्रतिबद्ध संदेशों, लेखक और प्रतिबद्ध तारीखों को रखने का लाभ है।
एम। जस्टिन

0

एक पूरक के रूप में, केवल एक विशिष्ट प्रतिबद्ध के लिए पैच का उत्पादन करने के लिए, उपयोग करें:

git format-patch -1 <sha>

जब पैच फ़ाइल उत्पन्न होती है, तो सुनिश्चित करें कि आपका अन्य रेपो जानता है कि यह आपके उपयोग के समय कहां है git am ${patch-name}

पैच को जोड़ने से पहले, git apply --check ${patch-name}यह सुनिश्चित करने के लिए उपयोग करें कि कोई गड़बड़ नहीं है।

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