2012-09-14 23 views
19

मैं गिट के धैर्य diff एल्गोरिदम का उपयोग करना चाहता हूं (--patience तर्क के साथ git diff के साथ आप git add -p के साथ प्राप्त करते हैं)। मैं यह कैसे कर सकता हूँ?इंटरैक्टिव जोड़ने के लिए गिट के धैर्य diff एल्गोरिदम का उपयोग करें

पृष्ठभूमि: मैं कुछ एक्सएमएल फाइलों के साथ काम कर रहा हूं, और git diff के सामान्य एल्गोरिदम produces pretty poor diffs due to "misaligned" entry/exit tags। अगर मैं git diff --patience चलाता हूं, तो मुझे और अधिक उपयोगी अंतर मिलते हैं, लेकिन git add -p में इन diffs का उपयोग करने का कोई स्पष्ट तरीका नहीं है।

git diff --patience <commitA> <commitB> > /tmp/patch.out 
# checkout a new branch or otherwise do what you need to prep 
git apply < /tmp/patch.out 

कि करने के लिए diff के उत्पादन में लागू कर देंगे:

+3

मुझे यकीन नहीं है कि आप अभी यह कर सकते हैं, लेकिन यह 'गिट' डेवलपर्स को बनाने के लिए एक योग्य सुझाव की तरह लगता है ... वास्तव में, अन्य 'गिट diff' विकल्प भी हो सकते हैं जो उपयोगी होंगे 'git add' और अन्य स्थानों पर खुलासा करने के लिए जहां अन्यथा डिफ़ॉल्ट-ish' git diff' किया जाता है ... – twalberg

+0

इस पंक्ति को कोड में देखें: https://github.com/git/git/blob/master/builtin /add.c#L273 – greg0ire

उत्तर

30

git add -p वर्तमान में diff झंडे को खारिज कर दिया है, लेकिन आप diff.algorithm config विकल्प का उपयोग कर सकते हैं:

git config --global diff.algorithm patience 

Git 1.8.2 में नई।

+1

मीठा! अब मुझे सिग्विन गिट को पकड़ने के लिए इंतजार करना है ... –

+0

क्या यह गिट प्रतिबद्धता के लिए एल्गोरिदम भी बदल सकता है? – fantastory

4

Hmmmm ... एक बात तुम कर सकते हो पाइप एक अस्थायी जगह पर git diff के उत्पादन, तो यह git apply साथ में वापस पढ़ें है कार्यशील निर्देशिका, लेकिन यह परिवर्तनों को प्रतिबद्ध या चरणबद्ध नहीं करेगा। इसके बाद आप git add -p चला सकते हैं जैसा कि आप सामान्य रूप से करेंगे, और --patience diff वह परिवर्तन होंगे जो आप इंटरैक्टिव रूप से जोड़ रहे हैं।

कोई कारण नहीं है कि आप diffapply पर सीधे पाइप नहीं कर पा रहे हैं, अगर यह आपके वर्कफ़्लो के लिए बेहतर है। उत्पादन एकीकरण के लिए अपनी स्थानीय शाखाओं का पुनर्निर्माण करते समय मैं काफी नियमित रूप से करता हूं।

ऐसा लगता है कि यह भी एक merge strategy, रूप में इसका इस्तेमाल कर सकते हैं तो यह मामला है कि बजाय सहभागी डिफ जोड़ने के लिए, आप बस आप क्या चाहते हैं के साथ एक शाखा बनाएँगे, तब में यह मर्ज कर सकते हैं हो सकता है।

+0

यही वह है जो मैं वर्तमान में कर रहा हूं; यह मुझे पैच को संपादित करने देता है, जो अनिवार्य रूप से मैं 'git add -p' के साथ करना चाहता हूं। ऐसा लगता है कि यह होना चाहिए उससे भी ज्यादा कठिन। –

+0

@me_and ने मर्ज रणनीति के रूप में इसका उपयोग करने के बारे में कुछ नोट्स भी जोड़े। शायद आप केवल इच्छित परिवर्तनों के साथ एक ट्रैश विलय शाखा उत्पन्न कर सकते हैं, फिर बेहतर परिणाम प्राप्त करने के लिए विलय रणनीति का उपयोग करें। – Christopher

10

यह मेरे लिए काम किया:

git -c diff.algorithm=patience add -p [...] 

मैं Cygwin के क्षेत्र में नवीनतम Git v2.1.0 चल रहा हूँ।

+2

हां, जैसा कि @Tobu पहले ही स्वीकार किए गए उत्तर में नोट किया गया है, कि कॉन्फ़िगर ध्वज गिट v1.8.2 में जोड़ा गया था। यह साइगविन पर एक अद्यतित गिट बिल्ड प्राप्त करने का तरीका रखता है, जो रखरखाव को लेना है, जो वास्तव में मैं कर रहा हूं :) –

+0

@me_and: तो मुझे अंततः अद्यतन संस्करण प्राप्त करने के लिए धन्यवाद देना है सिगविन गिट :) यह काफी समय से निष्क्रिय है .. मेरे जवाब के लिए, मैं सिर्फ वैश्विक विन्यास को संशोधित किए बिना कॉन्फ़िगर इनलाइन को बदलना संभव बनाना चाहता हूं। – Amro

+1

@me_and यहां दिलचस्प बात यह है कि यह कॉन्फ़िगरेशन विकल्प केवल अस्थायी है और इस तरह क्ली-फ्लैग के रूप में पारित किया जा सकता है – ohcibi