फ़ाइल को "git diff" से बाहर करना चाहते हैं


229

मैं एक फ़ाइल को ( db/irrelevant.phpजीआईटी अंतर से) बाहर करने की कोशिश कर रहा हूं । मैं में एक फ़ाइल डालने की कोशिश की है dbउपनिर्देशिका बुलाया .gitattributesलाइन के साथ irrelevant.php -diff और मैं भी एक फ़ाइल कहा जाता है बनाने की कोशिश की है .git/info/attributesयुक्त db/irrelevant.php

सभी मामलों में, db/irrelevant.phpफ़ाइल को Git बाइनरी पैच के रूप में अंतर में शामिल किया गया है। मैं जो चाहता हूं, उस फाइल के बदलाव के लिए अलग कमांड द्वारा अनदेखा किया जाना है। मैं क्या गलत कर रहा हूं?

जवाबों:


325

Omg, ड्राइवरों और awk एक घटिया फ़ाइल को बाहर करने के लिए? कुछ 1.9 के बाद से आप कर सकते हैं:

git diff -- . ':(exclude)db/irrelevant.php' ':(exclude)db/irrelevant2.php'

आह, लालित्य! उद्धृत उत्तर देखें और इस उत्तर के विवरण के लिए @torek द्वारा


4
नोट: यदि आप एक विशिष्ट फ़ाइल नाम को छोड़ना चाहते हैं, तो आपको .gitignoreफ़ाइल सिंटैक्स से अलग, तारांकन के साथ उपसर्ग करना होगा । के :!*shrinkwrap.yamlबजाय एग :!shrinkwrap.yaml
वघन

7
अधिक फ़ाइलों को छोड़ दें, जैसे मेरे पास * .min.css और * .min.js फाइलें हैं जो गिट भिन्न से बचने के लिए हैं। इसलिए, मैं कमांड का उपयोग करता हूंgit diff -- . ':(exclude)*.min.js' ':(exclude)*.min.css'
महेशवाघमारे

4
विंडोज़ सिंटैक्स : git diff -- . ":(exclude)db/irrelevant.php"(सिंगल कोट्स के बजाय दोहरे उद्धरण)
cnlevy

4
धन्यवाद! इस तरह की गूढ़ वाक्य रचना .. मुझे इसे हर बार देखना होगा।
डैनियल वालट्रिप

1
@cnlevy या कोई उद्धरण नहीं! git diff -- . :(exclude)db/irrelevant.php
मथियास

62

आप एक बिना ऑप कमांड वाले कस्टम डिफ ड्राइवर सेट कर सकते हैं और इसे उन फाइलों को असाइन कर सकते हैं जिन्हें नजरअंदाज किया जाना चाहिए।

इस आदेश के साथ एक रिपॉजिटरी विशिष्ट भिन्न ड्राइवर बनाएँ

git config diff.nodiff.command /bin/true

या के साथ अपने सभी repos के लिए --global

(यदि /bin/trueMacOS में मौजूद नहीं है, तो विकल्प का उपयोग किया जाएगा /usr/bin/trueया echo)।

फिर, उन फ़ाइलों में नया अंतर ड्राइवर असाइन करें जिन्हें आप अपनी .git/info/attributesफ़ाइल में अनदेखा करना चाहते हैं

irrelevant.php    diff=nodiff

इस राज्य अन्य डेवलपर के साथ साझा करने के लिए माना जाता है, तो आप इस्तेमाल कर सकते हैं .gitattributesके बजाय .git/info/attributesऔर साझा git config(एक प्रलेखन फ़ाइल या कुछ और के माध्यम से) अपने साथियों के साथ आदेश।


2
यह वही है जो मैं देख रहा था - जैसा कि kerneltrap.org/mailarchive/git/2008/10/17/3711254 में मैंने संपादित किया है ~ / .gitconfig को जोड़ते हुए: [diff "nodiff"] `कमांड = / बिन / सच` और फिर मैंने एक फाइल बनाई। .it / जानकारी / विशेषताएँ जिसमें मैंने जोड़ा: irrelevant.php diff=nodiff
माइकल

12
इस जवाब ने मेरे लिए बहुत बेहतर काम किया: stackoverflow.com/questions/1016798/…
नील फॉरेस्टर

3
दिलचस्प है कि इस दृष्टिकोण के साथ काम नहीं करता है git diff --stat। उस स्थिति में, व्यक्ति git diff ... | diffstatवर्कअराउंड के रूप में उपयोग कर सकता है ।
ddkilzer

@ मिचेल जो लिंक को बोर्क करता दिख रहा है, क्या कोई और है?
डिकिएबॉय जूल

3
बस एक अतिरिक्त: यदि आप इसे किसी भी तरह प्रदर्शित करने के लिए जोर लगाना चाहते हैं, तो उपयोग करें--no-ext-diff
फ्लोरियन क्लेन

35

आप किसी भिन्न के कुछ हिस्सों को बाहर करने के लिए पैचुटिल्स प्रोग्राम संग्रह के फ़िल्टरडिफ प्रोग्राम का भी उपयोग कर सकते हैं । उदाहरण के लिए:

git diff | filterdiff -p 1 -x db/irrelevant.php

4
ध्यान दें कि -p, मैनपेज (1) से, "-pn, --strip-match = n मिलान करते समय, pathname के पहले n घटकों को अनदेखा करें।" ओपी के रास्ते से उस हिस्से -p 1को हटाने में मुझे कुछ समय लगा db। यदि आप केवल एक फ़ाइल नाम निर्दिष्ट करना चाहते हैं और सभी पथ / dir संभावनाओं को अनदेखा करना चाहते हैं, तो आप उपयोग कर सकते हैं -p 99
टायलर कोलियर

32

यह विधि स्वीकृत उत्तरों से छोटी है।

git diff 987200fbfb 878cee40ba --stat -- ':!*.cs'

विभिन्न समावेश / बहिष्करण संभावनाओं के बारे में अधिक जानकारी के लिए इस अन्य पोस्ट को पढ़ें


ध्यान रखें कि फ़िल्टर केवल आपकी वर्तमान निर्देशिका के नीचे की सभी फ़ाइलों पर लागू होता है।
चील दस ब्रिंक

यह सबसे अच्छा जवाब था। मैं इसे थोड़ा और सरल करने में सक्षम था: stackoverflow.com/a/58845608/3886183
dlsso

2
मैं -स्टैट भाग को हटा दूंगा, या कम से कम यह बताऊंगा कि यह क्या करता है, क्योंकि किसी भी अन्य उत्तर में यह शामिल नहीं है।
मिक्स 3 डी

स्टेट फ्लैग आपको फ़ाइलों और उनके अलग-अलग योगों को दिखाता है, जो आपको आसानी से जांचने की अनुमति देता है कि क्या फ़िल्टर आपके इच्छित तरीके से काम करता है।
चायल ब्रिनके

17

इस एक-लाइन समाधान के लिए अन्य बर्तनों / डाउनलोड की आवश्यकता नहीं है:

git diff `git status -s |grep -v ^\ D |grep -v file/to/exclude.txt |cut -b4-`

file/to/exclude.txtउस फ़ाइल का नाम कहां है जिसे आप बाहर करना चाहते हैं, निश्चित रूप से।

संपादित करें: अंतर को तोड़ने वाली हटाई गई फ़ाइलों को ठीक करने के लिए क्रेडिट ksenzee


मैं git diff --stat masterबहुत सफलता के बिना आपके एक लाइनर को अनुकूलित करने की कोशिश कर रहा हूं - क्या आप मदद कर सकते हैं?
Mr_and_Mrs_D

13

KurzedMetal से वास्तव में अच्छा जवाब मुझे क्या करना चाहिए, लिए , जो यह देखने की क्षमता थी कि फ़ाइल बदल गई है, लेकिन उस अंतर को उत्पन्न करने के लिए नहीं, जो मेरे मामले में बहुत बड़ा हो सकता था।

लेकिन मेरे एक सहयोगी ने दृष्टिकोण का सुझाव दिया जो कि और भी सरल था और मेरे लिए काम किया:

.gitattributesनिर्देशिका में फ़ाइल को जोड़ना जहाँ फ़ाइल को अनदेखा किया जाना git diffहै, वह निम्नलिखित सामग्री के साथ रहती है:

file-not-to-diff.bin -diff

git statusयदि फ़ाइल बदली गई है तब भी "देखना" है। git diffयह भी देखेगा कि फ़ाइल बदल गई, लेकिन यह उत्पन्न नहीं करेगा diff

यही कारण है कि .binउदाहरण में फ़ाइल के लिए विस्तार जानबूझकर किया गया था। मुझे एहसास है कि यह द्विआधारी फ़ाइलों के लिए गिट का डिफ़ॉल्ट व्यवहार है, और इसके साथ विशेष हैंडलिंग की आवश्यकता नहीं है .gitattributes। लेकिन मेरे मामले में, इन फ़ाइलों को गिट और "फ़ाइल" उपयोगिता द्वारा पाठ फ़ाइलों के रूप में मान्यता दी गई थी और इसने यह चाल चली।


11

सरलतम उत्तर

git diff ':!db/irrelevant.php'

यह ':!<path to file>'आपके अलग कमांड के बाद है। आप चाहते हैं के रूप में अलग आदेश के रूप में जटिल हो सकता है, और आप चाहें तो वाइल्डकार्ड का उपयोग कर सकते हैं *.min.jsया यदि आप चाहें तो कई अपवर्जित (अलग-अलग उद्धृत ब्लॉकों को जोड़ सकते हैं )।


5

गिट रूट निर्देशिका के सापेक्ष

git diff एक वैकल्पिक अपवर्जित स्वीकार करता है

git diff -- ":(exclude)thingToExclude"

आप कुछ वाइल्ड कार्ड जोड़ना चाह सकते हैं

git diff -- ":(exclude)*/thingToExclude/*"

विशिष्ट फ़ाइल प्रकारों को लक्षित करें

git diff -- ":(exclude)*/$1/*.png"

या अपने dotfiles के लिए एक छोटी सी स्क्रिप्ट ड्रॉप

जैसे कि .bash_profileया.zshrc

gde() {
    # git diff exclude files or folders 
    # usage: 
    # gde fileOrFolderNameToExclude
    git diff -- ":(exclude)*/$1/*"
}

यह सिर्फ मेरे लिए काम नहीं करता है, मुझे दोनों सिंटैक्स के साथ, (बाहर) या (का उपयोग करके) में कोई अंतर नहीं मिलता है। मेरे पास २.२१.०.0 है
ओलिव्व्व

आप अस्थिर या मंचित फ़ाइलों को अलग कर सकते हैं। यदि आपने उन्हें जोड़ दिया है तो उनका मंचन हो जाता है। यदि वे मंचन कर रहे हैं तो आप कर सकते हैं git diff --stagedआशा है कि यह आपकी मदद करता है।
जसोनलोनहार्ड

सिंथेटिक, बृहदान्त्र क्या कर रहा है?
योना

2

यह बहुत सरल है, आप मानक यूनिक्स कमांड का उपयोग करके जो चाहते हैं, उसे बाहर कर सकते हैं, उन आदेशों को विंडोज़ पर्यावरण के तहत भी गिट बैश के तहत उपलब्ध हैं। नीचे दिए गए उदाहरण से पता चलता है कि pom.xml फ़ाइलों के लिए अंतर को कैसे अलग करना है, पहले केवल फ़ाइल नाम के लिए मास्टर करने के लिए अलग-अलग जांच करें, फिर 'grep -v' का उपयोग करके उन फ़ाइलों को छोड़ दें जो आप नहीं चाहते हैं और फिर फिर से पूर्व-निर्धारित सूची के साथ मास्टर में बदल दें:

git diff master `git diff --name-only master | grep -v pom.xml`

1

बेन रूक्स के समाधान के समान , लेकिन वैसे भी साझा करना:

git status --porcelain | grep -v $PATTERN_TO_EXCLUDE | awk '{print $2}' | xargs git diff

या, यदि परिवर्तन पहले से ही स्थानीय रूप से प्रतिबद्ध हैं:

git diff --name-only origin/master | grep -v $PATTERN_TO_EXCLUDE | xargs git diff origin/master

उदाहरण:

git status --porcelain | grep -v docs | awk '{print $2}' | xargs git diff origin/master

git diff --name-only origin/master | grep -v docs | xargs git diff origin/master

1

मैं निम्नलिखित कार्य करता हूं:

git add *pattern_to_exclude*
git diff
git reset HEAD .

मुझे पता है कि यह एक सुरुचिपूर्ण समाधान नहीं है और इसे कभी-कभी इस्तेमाल नहीं किया जा सकता है (जैसे। यदि आपके पास पहले से ही सामान है), लेकिन यह एक जटिल कमांड टाइप किए बिना चाल चलता है


0

यदि आप केवल नेत्रहीन रूप से अंतर का निरीक्षण करना चाहते हैं, तो एक दृश्य अंतर उपकरण (जैसे मेल्ड ) आपको एक छोटी कमांड के साथ ऐसा करने देगा जो याद रखना आसान है।

यदि आपने पहले से नहीं किया है, तो सबसे पहले एक अलग टूल सेट करें।

$ git config --global diff.tool = meld

फिर, आप एक निर्देशिका अलग चला सकते हैं।

$ git difftool --dir-diff

आप Meld (या अपनी पसंद के उपकरण) में डिफरेंशियल (फाइल द्वारा) ब्राउज़ कर पाएंगे। बस उस फ़ाइल को न खोलें जिसे आप अनदेखा करना चाहते हैं।

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