2009-06-19 18 views
57

से फ़ाइलों को छोड़कर मैं एक परियोजना को गिट के साथ ट्रैक कर रहा हूं। कामकाजी प्रतिलिपि में कुछ एक्सकोड प्रोजेक्ट फ़ाइलें हैं जिन्हें मैं ट्रैकिंग रखना चाहता हूं, लेकिन diffs में नहीं देखना चाहता, क्योंकि हमेशा दर्जनों बदली हुई रेखाएं होती हैं जिनमें मुझे कभी दिलचस्पी नहीं होती है। क्या git-diff छोड़ने का कोई आसान तरीका है इन फाइलें?गिट-diff

 
$ cat .gitattributes 
Project.xcodeproj/* diff=nodiff 

$ cat ~/.gitconfig 
[diff "nodiff"] 
    command = /bin/true 

लेकिन:

 
$ git diff 
external diff died, stopping at Project.xcodeproj/zoul.mode1v3. 

क्या मैं गलत कर रहा हूँ मैं एक कस्टम "मूक" diff उपकरण स्थापित करने के लिए कोशिश की है?

उत्तर

80

समस्या यह है कि /bin/true अपने इनपुट पढ़ने के बिना तुरंत वापस आ जाएगी है:

sudo apt-get install patchutils 

फिर भी diff यह कुछ कचरा छोड़ देता है सही नहीं है,। git diff इसलिए सोचता है, काफी हद तक, यह समय से पहले मर गया है।

आप वास्तव में क्या करना चाहते हैं diff विशेषता को अनसेट करना है, इसे एक फर्जी कमांड पर सेट न करें। अपने .gitattributes में इस प्रयास करें:

Project.xcodeproj/* -diff 
+0

हां, यह ठीक काम करता है, बहुत बहुत धन्यवाद। – zoul

+5

पूरी निर्देशिका को छोड़कर मेरे लिए काम नहीं किया, क्योंकि कई फाइलें गहरी उपनिवेश में हैं। इसके बजाय * .xcuserstate -diff अक्सर बदलती फ़ाइल को अनदेखा करने में सहायक था। – Bemmu

+0

@ बेम्मु: निष्पक्ष होने के लिए, मैं केवल प्रश्न के समान पैटर्न का उपयोग कर रहा था। कोई सुझाव नहीं था कि पैटर्न मूल पूछताछ की स्थिति में काम नहीं कर रहा था। –

6

आप अपने .git/config

[alias] 
     mydiff = !git diff | filterdiff -x "*/Project.xcodeproj/*" 

में एक उपनाम का उपयोग कर सकते आप इस चाल के लिए (patchutils से) filterdiff की जरूरत है।

[email protected]:~/git-filter-test$ git mydiff 
diff --git a/Project.xcodeproj/dummy.txt b/Project.xcodeproj/dummy.txt 
index 3e1f9e6..89dfed9 100644 
diff --git a/dummy2.txt b/dummy2.txt 
index 91966ce..d9588a9 100644 
--- a/titi.txt 
+++ b/titi.txt 
@@ -1,3 +1,3 @@ 
aaaaaaaaaa 
-bbbbbbbbb 
cccccc 
+ddd 
+0

यह बहुत अच्छा है, धन्यवाद। कचरा ठीक है, कम से कम मुझे पता है कि उन फ़ाइलों को बदल दिया है। लेकिन मैं रंग खो देता हूं, क्या इसे वापस पाने का कोई तरीका है? मैंने गिट diff --color को मजबूर करने की कोशिश की, लेकिन फिर फ़िल्टरडिफ रंग से बच निकलता है और फ़िल्टरिंग बंद कर देता है। – zoul

+0

ओह हाँ, | colordiff | कम – zoul

+0

इस प्रश्न के उत्तर के लिए धन्यवाद - फ़िल्टरडिफ़ मेरी आवश्यकताओं को पूरा कर रहा है - हालांकि, शेष "कचरा" मुझे परेशानी का कारण बन रहा है - क्या फ़िल्टरडिफ़ का उपयोग करके "फ़ाइल के सभी संदर्भ को पूरी तरह से हटाएं" कहने का कोई तरीका है? – Michael

0

बस बैठाना किसी और एक ही दर्द हम था है। हम पहले से ही एक फाइल को बाहर करना चाहते थे जो पहले से ही किया गया था। working with .git/info/exclude too late

विशेष रूप से क्या आप वास्तव में उपयोग किया जाता है एक फ़ाइल को अनदेखा करने की जरूरत है आदेश Git हटाने Git rm (http://www.kernel.org/pub/software/scm/git/docs/git-rm.html)

आप इसे जाकर परीक्षण देखें:

इस पोस्ट में जिस तरह से और अधिक उपयोगी था

git rm --dry-run *.log
(आप सभी को बाहर करना चाहता था कहते हैं लॉग फाइलें)

यह होगा यदि आप इसे चलाते हैं तो बाहर कर दिया जाएगा।

तो

आप इसे

git rm *.log
जा रहा द्वारा चलाए जा रहे (या जो भी फाइल नाम पथ/अभिव्यक्ति आप चाहते हैं)

7

एक अन्य समाधान है कि किसी भी बाहरी उपकरण के बिना स्वच्छ उत्पादन का उत्पादन (जोड़ने .git/config):

[alias] 
    mydiff = !git diff -- $(git diff --name-only | grep -Ev "Project.xcodeproj/") 

फिर से इसे चलाने:

git mydiff 

ध्यान दें कि git diff --name-onlygit ls-files की तुलना में बेहतर है, क्योंकि यह, git diff करने के लिए फ़ाइलों की एक छोटी सूची पारित करेंगे के बाद से केवल उन्हीं फ़ाइलों को संशोधित कर रहे हैं शामिल किया जाएगा। git ls-files का उपयोग करते समय मैंने बड़ी परियोजनाओं में अधिकतम संख्या में तर्कों को पार करने में परेशानी का सामना किया है।

+0

मैं इसके साथ जटिल पथ के साथ मुद्दों में भाग गया। मुझे संदेह है कि यदि आप -z स्विच का उपयोग करते हैं तो यह बेहतर होगा: "पथनामों को मर्ज न करें और आउटपुट फील्ड टर्मिनेटर के रूप में एनयूएल का उपयोग करें"। –