विशिष्ट प्रतिबद्धता के लिए गिट पैच कैसे उत्पन्न करें?


1231

मुझे एक स्क्रिप्ट लिखने की ज़रूरत है जो SHA1 प्रतिबद्ध संख्याओं की सूची के लिए पैच बनाता है।

मैंने प्रयोग करने की कोशिश की git format-patch <the SHA1>, लेकिन उस SHA1 के बाद से प्रत्येक प्रतिबद्ध के लिए एक पैच उत्पन्न हुआ। कुछ सौ पैच उत्पन्न होने के बाद, मुझे इस प्रक्रिया को मारना पड़ा।

वहाँ केवल विशिष्ट SHA1 के लिए एक पैच उत्पन्न करने का एक तरीका है?

जवाबों:


1989

प्रयत्न:

git format-patch -1 <sha>

या

git format-patch -1 HEAD

ऊपर दिए गए दस्तावेज़ीकरण लिंक के अनुसार, -1ध्वज बताता है कि पैच में कितने कमिट शामिल किए जाने चाहिए;

- <n>

     सबसे ऊपर से पैच तैयार करें।


आदेश के साथ पैच लागू करें:

git am < file.patch

210
पैच लागू करना: git apply --stat file.patch# शो आँकड़े। git apply --check file.patch# आवेदन करने से पहले त्रुटि की जांच करें। git am < file.patch# अंत में पैच अप्लाई करें।
एड्रियन

3
यदि अंतिम प्रतिबद्ध किसी अन्य शाखा से मर्ज है, तो यह काम नहीं करता है।
लेक्स ली

2
CRLF लाइन एंडिंग का उपयोग करके फाइलों पर पैच लगाने के लिए:git am --keep-cr < mypatch.patch
माइकल शमीयर

40
git am -3 < file.patchतीन-तरफा मर्ज का उपयोग करके आवेदन करने के लिए उपयोग करें जो आपको यहां पाए जाने वालेgit mergetool (या मैन्युअल रूप से संपादन) का उपयोग करके संघर्षों को हल करने देगा ।
मैट

6
यह कमांड कमिट से केवल एक विशिष्ट फ़ाइल के लिए भी काम करता है: git format-patch -1 <sha> path/to/file.jsयह केवल एक पैच बनाएगा जिसमें फाइल के लिए डिफरेंशियल मौजूद होंगे। Js
क्रिस्टोफ डोम्बी

281

एक विशिष्ट sha1 हैश से सबसे ऊपर से पैच बनाने के लिए:

git format-patch -<n> <SHA1>

एक पैच फाइल में सिर से पिछले 10 पैच:

git format-patch -10 HEAD --stdout > 0001-last-10-commits.patch

2
क्या आप पहले आदेश के लिए एक उदाहरण प्रदान करने के लिए पर्याप्त दयालु हो सकते हैं
कसुन सियामबलपिटिया

1
git format-patch -1 HEADसबसे हाल ही में प्रतिबद्ध के लिए पैच उत्पन्न करेगा
श्रीराम मुरली

1
यह पूछने के लिए मुझे क्षमा करें, इसलिए जब यह -2हाल के 2 के लिए पैच उत्पन्न करता है, तो यह है, और स्पष्टीकरण के लिए एक और बात यह है कि कमांड got format-patch -2 HEADलाइन के समान हैgit format-patch HEAD~2
कसुन सियामबलपिटिया

85

कहते हैं कि आप आईडी 2 के बाद प्रतिबद्ध हैं 1 आप चलाने में सक्षम हो जाएगा:

git diff 2 1 > mypatch.diff

जहाँ 2 और 1 SHA हैश हैं।


उत्तर के लिए धन्यवाद dookehster। इसका मतलब है कि मुझे उन कमिट्स को ढूंढने के लिए स्क्रिप्ट की जरूरत है, जो उन चीजों से पहले हैं जिनकी मुझे दिलचस्पी है। मुझे उम्मीद थी कि मैं इससे बच सकता हूं।
एले

11
@ नहीं, नहीं, आप नहीं - git diff hash^ hash। "हैश ^" पूर्ववर्ती वचन दें। (लेकिन, ज़ाहिर है, मनोज् यों का जवाब बेहतर है)
जे -16 एसडीआईजेड

2
git show HEAD > mypatch.diffजब आप कमिट में हों तो आपको भी ऐसा ही करना चाहिए।
-हो

1
@dookehester यह सही है या यह दूसरा तरीका है,git diff 1 2
कसुन सियामबलपिटिया

1
यह किसी भी बाइनरी फ़ाइलों को अंतर में शामिल करने में विफल होगा।
जुआन

55

यह आदेश (जैसा कि @ Naftuli Tzvi Kay द्वारा पहले ही सुझाया गया है ):

git format-patch -1 HEAD

HEADविशिष्ट हैश या रेंज के साथ बदलें ।

UNIX मेलबॉक्स प्रारूप से मेल खाने के लिए प्रारूपित नवीनतम कमिट के लिए पैच फ़ाइल उत्पन्न करेगा।

-<n> - सबसे ऊपर से पैच तैयार करें।

तब आप मेलबॉक्स फ़ाइल में पैच फ़ाइल को फिर से लागू कर सकते हैं:

git am -3k 001*.patch

देखें: man git-format-patch


धन्यवाद! मुझे लगता है कि यह ध्यान देने योग्य है कि पैच लगाने से कमिटेड मैसेज के साथ एक कमिट बनेगा, जिसे [PATCH] ने उपसर्ग किया है। हालांकि इसे ठीक करना आसान है
माइक एस

2
अभूतपूर्व। ओपी, आपने इसे स्वीकार नहीं किया है, क्योंकि ...? @ माइक नहीं, यह किसी भी अन्य- gitविकृत पैच की तुलना में नहीं है, कम से कम अगर उपयोगकर्ता इसे सही तरीके से लागू करता है।
अंडरस्कोर_ड

2
@ माइक ने वास्तव में इसकी जांच क्यों नहीं की, लेकिन -kझंडे को छोड़ कर ( git am -3) ने यह फ़ॉर्म मुझे निर्धारित किया (कोई PATCH[0/10]प्रतिबद्ध संदेश नहीं)। Git संस्करण 2.20.1.windows.1
जॅनिस

30
git format-patch commit_Id~1..commit_Id  
git apply patch-file-name

तेज और सरल उपाय।


5
इसके अलावा git apply --check patch-file-nameएक पैच लगाने से पहले कॉल करना न भूलें । इससे समस्याओं से बचने में मदद मिलेगी।
इमान्तोनी

16

यदि आप यह सुनिश्चित करना चाहते हैं कि एक विशिष्ट प्रतिबद्ध के शीर्ष पर (एकल कमिट) पैच लागू किया जाएगा, तो आप नए git 2.9 (जून 2016) विकल्प का उपयोग कर सकते हैं git format-patch --base

git format-patch --base=COMMIT_VALUE~ -M -C COMMIT_VALUE~..COMMIT_VALUE

# or
git format-patch --base=auto -M -C COMMIT_VALUE~..COMMIT_VALUE

# or
git config format.useAutoBase true
git format-patch -M -C COMMIT_VALUE~..COMMIT_VALUE

देखें bb52995 प्रतिबद्ध , प्रतिबद्ध 3de6651 , प्रतिबद्ध fa2ab86 , प्रतिबद्ध ded2c09 (26 अप्रैल 2016) से Xiaolong ये ( ``)
( जूनियो सी gitsterहमानो द्वारा विलय - - में 72ce3ff , 23 मई 2016)

format-patch: --baseआधार ट्री जानकारी को रिकॉर्ड करने के लिए ' ' विकल्प जोड़ें

अनुरक्षक या तीसरे पक्ष के परीक्षक पैच श्रृंखला पर लागू सटीक आधार वृक्ष जानना चाह सकते हैं। --baseबेस ट्री जानकारी रिकॉर्ड करने के लिए git फॉर्मेट-पैच 'a' विकल्प सिखाएं और इसे पहले संदेश के अंत में जोड़ दें (या तो कवर पत्र या श्रृंखला में पहला पैच)।

बेस ट्री की जानकारी में "बेस कमिट" होता है, जो कि एक जानी-मानी कमिटमेंट है, जो प्रोजेक्ट हिस्ट्री के स्थिर भाग का हिस्सा है, जो बाकी सब काम करता है, और शून्य या अधिक "पूर्वापेक्षित पैच", जो अच्छी तरह से जाना जाता है फ्लाइट में पैच जो "बेस कमिट" का हिस्सा नहीं है जिन्हें पैच लगाने से पहले टोपोलॉजिकल ऑर्डर में "बेस कमेट" के ऊपर लगाने की जरूरत है।

"बेस कमिट" को " base-commit:" ऑब्जेक्ट ऑब्जेक्ट नाम के 40-हेक्स के बाद दिखाया गया है ।
एक "पूर्वापेक्षा पैच" को " prerequisite-patch-id:" 40-हेक्स "पैच आईडी" के बाद दिखाया गया है , जिसे " git patch-id --stable" कमांड के माध्यम से पैच पास करके प्राप्त किया जा सकता है ।


Git 2.23 (Q3 2019) में सुधार होगा, क्योंकि " --base" का विकल्प " format-patch" patch-idsएक अस्थिर तरीके से पूर्वापेक्षा पैच के लिए गणना करता है , जिसे इस तरह से गणना करने के लिए अद्यतन किया गया है जो " git patch-id --stable" के साथ संगत है ।

देखें स्टीफन बॉयड ( ) द्वारा a8f6855 , 6f93d26 (26 अप्रैल 2019) के लिए प्रतिबद्धakshayka
(द्वारा विलय Junio सी Hamano - gitster- में प्रतिबद्ध 8202d12 , 13 जून 2019)

format-patch: --base patch-idआउटपुट को स्थिर बनाते हैं

जब भी हम patch-idपीढ़ी कोड में एक हंक को संसाधित करते हैं, तो हम संदर्भ को नहीं रोक रहे थे diff.c, लेकिन हम ऐसा कर रहे थे जब हमने ' patch-id' ' ' टूल ' ' के साथ "स्थिर" पैच-आइडी जनरेट किया था ।

चलिए उस समान तर्क को हम से अलग patch-id.cकरते हैं diff.cताकि हम उसी प्रकार का हैश प्राप्त कर सकें जब हम ' format-patch --base=' प्रकार के कमांड इनवोकेशन के लिए पैच-आईडी बना रहे हैं ।


Git 2.24 (Q4 2019) से पहले, " git format-patch -o <outdir>" ने " mkdir <outdir>" नहीं " mkdir -p <outdir>" के बराबर किया , जिसे सुधारा जा रहा है।

बर्ट वेसरग ( ) द्वारा देखें edefc31 (11 अक्टूबर 2019 )(द्वारा विलय Junio सी Hamano - - में प्रतिबद्ध f1afbb0 , 18 अक्टू 2019)bertwesarg
gitster

format-patch: आउटपुट डायरेक्टरी के प्रमुख घटक बनाएं

साइन-ऑफ-बाय: बर्ट वेसरग

'git format-पैच -o' ने 'mkdir' के बराबर 'mkdir -p' नहीं किया, जिसे सही किया जा रहा है।

adjust_shared_permअग्रणी निर्देशिकाओं पर ' ' के उपयोग से बचें, जिनमें सुरक्षा निहितार्थ हो सकते हैं। अस्थायी रूप से ' config.sharedRepository' जैसे ' git init' को अक्षम करने से प्राप्त होता है।


2.25 Git (Q1 2020) के साथ, " git rebase" जब अच्छी तरह से काम नहीं कियाformat.useAutoBase कॉन्फ़िगरेशन चर सेट , जिसे ठीक कर दिया गया है।

देखें cae0bc0 प्रतिबद्ध , 945dc55 प्रतिबद्ध , 700e006 प्रतिबद्ध , a749d01 प्रतिबद्ध , प्रतिबद्ध 0c47e06 द्वारा (04 दिसंबर 2019) डेंटन लियू ( Denton-L)
(द्वारा विलय Junio सी Hamano - gitster- में प्रतिबद्ध 71a7de7 , 16 दिसंबर 2019)

rebase: format.useAutoBaseब्रेक्जिट ठीक करें

रिपोर्टेड-बाय: क्रिश्चियन बायसिंगर
साइन-ऑफ-बाय: डेंटन लियू

format.useAutoBase = trueरनिंग रिबेस के साथ , एक त्रुटि हुई:

fatal: failed to get upstream, if you want to record base commit automatically,
please use git branch --set-upstream-to to track a remote branch.
Or you could specify base commit by --base=<base-commit-id> manually
error:
git encountered an error while preparing the patches to replay
these revisions:

ede2467cdedc63784887b587a61c36b7850ebfac..d8f581194799ae29bf5fa72a98cbae98a1198b12

As a result, git cannot rebase them.

इसे हमेशा रिबेट --no-baseसे फॉर्मेट-पैच में पास करके ठीक करें ताकि इसका प्रभाव format.useAutoBaseनकारात्मक हो।


8

किसी विशिष्ट कमिट से रास्ता तैयार करना (अंतिम कमिट नहीं):

git format-patch -M -C COMMIT_VALUE~1..COMMIT_VALUE

4

यदि आप निर्दिष्ट फ़ाइल को अलग करना चाहते हैं, तो आप यह कर सकते हैं:

git diff मास्टर 766eceb - कनेक्शन /> 000-mysql-कनेक्टर.patch


0

मेरी व्यापारिक पृष्ठभूमि के साथ मैं उपयोग करने जा रहा था:

git log --patch -1 $ID > $file

लेकिन मैं git format-patch -1 $IDअभी उपयोग करने पर विचार कर रहा हूं ।


-5

केवल विशिष्ट SHA1 के लिए एक पैच उत्पन्न करने का तरीका क्या है?

यह काफी सरल है:

विकल्प 1। git show commitID > myFile.patch

विकल्प 2। git commitID~1..commitID > myFile.patch

नोट: commitIDवास्तविक प्रतिबद्ध आईडी (SHA1 प्रतिबद्ध कोड) के साथ बदलें ।


3
विकल्प 1 सर्वथा गलत है और प्रश्न से असंबंधित है।
अंशुमान मनराल

3
विकल्प 2 भी एक अमान्य कमांड है। आपको इस तरह की त्रुटि मिलेगी: git a5f4bcaeb7fa7de27ae79d9522332e872889bbf0 ~ 1..a5f4bcaeb7fa7de27ae79d953878789bbf0 git: 'a5f4bcaeb77277b277b27277e27727277e27ae27ae2772727727277272772727727272277272772772727727727277272772772727727272 पर लीजिये। गिट - हेल्प ’देखें। उत्तर पोस्ट करने से पहले दलीलों की जांच
अंशुमान मनराल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.