Git को स्थापित किए बिना `git diff` पैच लागू करने के लिए कैसे?


280

मेरे ग्राहक git diffबिना स्थापित किए हुए पैच कैसे बना सकते हैं ? मैंने patchकमांड का उपयोग करने की कोशिश की है लेकिन यह हमेशा फ़ाइल नाम को पैच करने के लिए कहता है।


4
किसी को पता है कि यह कैसे करना है अगर पैच में नाम शामिल हैं? क्या पैच अब मूल रूप से समर्थन करता है?
पॉल क्रॉले

3
सवाल वास्तव में होना चाहिए: क्या बिना गिट स्थापित किए एक गिट भिन्न लागू करने का कोई तरीका है? जैसा कि नीचे उल्लेख किया गया है , patchपूरी तरह से इस प्रारूप का समर्थन नहीं करता है।
आर्येह लीब तौआरोग सेप

जवाबों:


425
git diff > patchfile

तथा

patch -p1 < patchfile

काम लेकिन जितने लोगों ने टिप्पणियों और अन्य उत्तरों पर ध्यान दिया, पैच समझ में नहीं आता, हटाता है और नाम बदल देता है। कोई विकल्प नहीं है, लेकिन git apply patchfileअगर आपको हैंडल फ़ाइल को जोड़ने, हटाने और नाम बदलने की आवश्यकता है।


EDIT दिसंबर 2015

patchकमांड के नवीनतम संस्करण (2.7, सितंबर 2012 में जारी किए गए) "नाम-स्वरूप" प्रारूप की अधिकांश विशेषताओं का समर्थन करते हैं, जिसमें नाम और प्रतियाँ, अनुमति परिवर्तन और सिम्लिंक भिन्न होते हैं (लेकिन अभी तक बाइनरी भिन्न नहीं होते हैं) ( रिलीज़ की घोषणा )।

इसलिए बशर्ते वर्तमान / नवीनतम संस्करण का patchउपयोग gitकिया जाए, ताकि पैच के रूप में इसका उपयोग लागू करने में सक्षम होने की आवश्यकता न हो।


97
या उपयोग करें git diff > patchfile, लेकिनpatch -p1 < patchfile
जकूब नारबस्की

11
यदि आप रिपॉजिटरी की एक सबपैथ का एक पैचफाइल बनाना चाहते हैं तो आप relativeविकल्प का उपयोग कर सकते हैं जैसे:git diff --no-prefix --relative=my/relative/path > patchfile
कोएन।

2
patch -p1 < patchfilegit स्थापित करने की आवश्यकता नहीं है। पहला कमांड डिफॉल्ट जेनरेट करने के लिए कमांड को प्रदर्शित करता है, इसे लागू नहीं करने के लिए।
एंड्री कुजनेत्सोव

1
उत्पन्न पैच परिवर्तन के लिए है से आदेश में संकेत शाखा / refspec के वर्तमान या सक्रिय शाखा। दूसरे शब्दों में, आप चाहते हैं git diff from_branch > patchfile; git checkout from_branch; git patch -p1 < patchfileयाgit diff from_branch to_branch > patchfile; ...
hobs

1
@PaulChechetin जैसा कि egor83 ने सूफी के जवाब में कहा कि यह शुरुआत में स्ट्रिप्स स्लैश है।
एंड्रे कुजनेत्सोव

75

इसे इस्तेमाल करे:

patch -p1 < patchfile

4
-P1 तर्क क्या करता है?
क्रिसजली

8
स्ट्रिप्स शुरुआत में स्लैश। मैन पैच
egor83

16
@chrisjlee git diffडाल देंगे a/और b/उपसर्गों उत्पादन में है, तो patch -p1पैच फ़ाइल लागू करने के लिए उन neglects।
wberry

49

उपयोग

git apply patchfile

अगर संभव हो तो।

patch -p1 < patchfile 

संभावित दुष्परिणाम है।

git applyयदि वे git diffप्रारूप में वर्णित हैं, तो फ़ाइल को जोड़ता है, हटाता है और नाम बदल देता है , जो patchऐसा नहीं करेगा। अंत में, git applyएक "सभी को लागू करें या सभी को निरस्त करें" मॉडल है जहां या तो सब कुछ लागू है या कुछ भी नहीं है, जबकि पैच आंशिक रूप से पैच फ़ाइलों को लागू कर सकता है, जिससे आपकी कार्यशील निर्देशिका एक अजीब स्थिति में रह सकती है।


1
+1, एकमात्र समझदार उत्तर। इसके अलावा, diff / पैच symlinks को हैंडल नहीं करेगा, जो कि एक समस्या है (यदि उदाहरण के लिए) आप 3.10 लिनक्स कर्नेल पैच को पुनः प्राप्त कर रहे हैं।
IGNIS

10
हां, git applyइसे करने का सबसे अच्छा तरीका है, लेकिन यह सवाल विशेष रूप से पूछता है कि बिना गिट के पैच को कैसे लगाया जाए
कॉलिन डी बेनेट

1
विकल्प --dry-run --verboseयह निर्धारित करने के लिए उपयोगी हैं कि दुष्प्रभाव क्या होगा, यदि कोई हो। (पैच v2.5.8 का उपयोग करते हुए)
स्पाइल

@ignis - " git apply patchfile -... एकमात्र समझदार उत्तर ..." - यह लगभग प्रशंसनीय है। जब भी ओपनएसएसएल के देवता मुझे परीक्षण के लिए एक पैच भेजते हैं, तो गिट इसे लागू करने में विफल रहता है। वह हर बार है। मैंने अभी तक देखा है कि बेवकूफ उपकरण एक पैच लागू करते हैं।
jww

8

मैं उपयोग करता हूं

patch -p1 --merge < patchfile

इस तरह, संघर्ष हमेशा की तरह हल हो सकते हैं।


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