गिट भिन्न से एक निर्देशिका को छोड़ दें


179

मैं सोच रहा हूं कि मैं अपने Git के अंतर से पूरी निर्देशिका को कैसे बाहर कर सकता हूं। (इस मामले में / कल्पना)। मैं git diff कमांड का उपयोग करके हमारे संपूर्ण सॉफ़्टवेयर रिलीज़ के लिए एक अंतर पैदा कर रहा हूं। हालाँकि चश्मे के परिवर्तन इस प्रक्रिया के लिए अप्रासंगिक हैं, और सिर्फ सिरदर्द पैदा करते हैं। अब मुझे पता है कि मैं कर सकता हूँ

git diff previous_release..current_release app/

यह ऐप डायरेक्टरी के सभी परिवर्तनों के लिए एक अंतर पैदा करेगा, लेकिन उदाहरण के लिए, लिब / डायरेक्टरी में नहीं। क्या कोई जानता है कि इस कार्य को कैसे पूरा किया जाए? धन्यवाद!

संपादित करें: मैं बस स्पष्ट होना चाहता हूं, मुझे पता है कि मैं अंत में अपनी सभी निर्देशिकाओं के मापदंडों को घटा सकता हूं, माइनस / कल्पना कर सकता हूं। मैं उम्मीद कर रहा था कि कमांड में एक एकल निर्देशिका को वास्तव में बाहर करने का एक तरीका था।


4
मुझे यह आश्चर्यजनक प्रश्न मिला क्योंकि मैं सबमॉडल्स को अनदेखा करने का लक्ष्य बना रहा था । इस मामले में, यदि आप मेरे जैसे भोले हैं, तो यह प्रश्न अधिक मददगार हो सकता है।
20:06 बजे ब्रांडीज़ी

यही कारण है कि अजीब है कि हम अभी भी सितं, 2016 को ऐसा करने के लिए कोई मूल Git स्विच है
माइकल जेड

जवाबों:


138

मान लें कि आप बैश का उपयोग करते हैं, और आपने विस्तारित ग्लोबिंग ( shopt -s extglob) सक्षम किया है , तो आप इसे शेल साइड से संभाल सकते हैं:

git diff previous_release current_release !(spec)

बचाता है कि आपको अन्य सभी चीजों को सूचीबद्ध करना है।

या, खोल-अज्ञेय:

git diff previous_release current_release --name-only | grep -v '^spec/' \
    | xargs git diff previous_release current_release --

आप तर्कों को फिर से लिखने के लिए खुद को बचाने के लिए एक-लाइनर शेल स्क्रिप्ट में लपेट सकते हैं।


1
पुनश्च ग्लोबिंग छिपा फ़ाइलों से मेल नहीं खाता, इसलिए यदि आप जुनूनी हैं, तो आप कील के लिए चाहते हो सकता है पर .!(.|)मैच सब कुछ करने के लिए एक साथ शुरू .करने के अलावा .और ..
कैस्केबेल

यह उन फ़ाइलों के लिए काम नहीं करता है जो एकदम नई हैं या शाखाओं में हटाई गई हैं। मुझे ऐसी त्रुटियां मिलती हैं जो स्क्रिप्ट के निष्पादन को रोक देती हैं, कहती हैं कि यह इसके खिलाफ अलग नहीं हो सकता।
ग्राहम क्रिस्टेंसेन

2
@ ग्राहम: मेरा मानना ​​है कि --मैंने जो जोड़ा है उसे ठीक करना चाहिए।
Cascabel

1
बहुत बढ़िया जवाब। मैं केवल नाम दिखाना चाहता था (वास्तविक अंतर नहीं) इसलिए मुझे --name-onlyबहुत अंत में जोड़ना था ।
अगस्त

1
इसके साथ खेलने के बाद, बस जोड़ना चाहते हैं कि यदि आप किसी फ़ाइल का नाम बदलते हैं, तो यह एक त्रुटि फेंक देगा लेकिन आपको बस इतना करना है कि इसे जोड़ना -- path/of/new/fileहोगा और यह पता
लगाएगा

321

इस उत्तर के आधार पर आप इसका उपयोग भी कर सकते हैं:

git diff previous_release..current_release -- . ':!spec'

यह एक नई सुविधा है जो कुछ रास्तों को छोड़कर अनुमति देता है। यह विभिन्न शेल ऑन्लाइनर की तुलना में अधिक विश्वसनीय होना चाहिए।

मैं इसे यहाँ पोस्ट कर रहा हूँ क्योंकि यह सवाल अभी भी # 1 हिट के लिए "git diff oute path" है।


4
इस उत्तर को प्यार करो। यदि विकल्प जोड़ते हैं तो डबल डैश से पहले ऐसा करें। जैसे: git diff previous_release current_release --name-status -- . ':!spec'
liamvictor 15

मैं के लिए शाखा के नाम इस्तेमाल कर सकते हैं एहसास नहीं था current_releaseऔर previous_release- बना मुझे मुस्कान जब मैं यह पता लगा।
Trueheart78

2
मेरे लिए क्या काम किया git diff --stat dev -- . ':!/Mopy/Docs/*'। मेरे और विविधताओं के लिए क्या काम नहीं कियाgit diff dev --stat -- . ':!('Mopy/Docs/Wrye Bash General Readme.html'|'Mopy/Docs/Wrye Bash Advanced Readme.html')'
Mr_and_Mrs_D

वास्तव में सहायक है। यहाँ अगर किसी भी फाइल बदल रहे हैं देखने के लिए वाक्य रचना, database.yml के अलावा अन्य है:git diff --check -- . ':!config/database.yml'
दान कोह्न

17
कई वस्तुओं को भी बाहर कर सकते हैं जैसे:git diff previous_release current_release -- . ':!file_a' ':!file_b'
छद्मनाम

37

यदि आप एक भिन्नता को बाहर करने के लिए एक से अधिक पथ निर्दिष्ट करना चाहते हैं, तो आप अंत में अतिरिक्त बहिष्करण पैरामीटर जोड़ते हैं, उदाहरण के लिए वेंडर और बिन डायरेक्टरी में सब कुछ आँकड़ों से बाहर करने के लिए : -

git diff --stat previous_release..current_release -- . ':!vendor' ':!bin'

33

आप कोशिश कर सकते हैं और किसी भी फाइल के लिए डिफॉल्ट डायरेक्टरी के लिए अलग-अलग विशेषता को अनसेट कर सकते हैं।
.gitattributes:

lib/* -diff

racl101 टिप्पणियों में जोड़ता है :

बस इसे जोड़ने के लिए, आप में से जो git diffएक विशिष्ट प्रकार की फ़ाइलों के उत्पादन को सीमित करना चाहते हैं , एक विशिष्ट निर्देशिका और उसके उपनिर्देशिकाओं के भीतर, जैसे आपकी .jsफ़ाइलों के वेबपैक के बंडल द्वारा उत्पन्न सभी जावास्क्रिप्ट , उदाहरण के लिए, आप इसे जोड़ सकते हैं को .gitattributes:

dist/js/**/*.js -diff

तब आपको अपने git के शोर में वह सब नहीं दिखाई देता जो आउटपुट में होता है और यह सिर्फ उसी रूप में प्रदर्शित होता है: Binary files ... differजो अधिक उपयोगी है।


हालांकि यह मेरे सभी रूपों से कल्पना को हटा देगा। मैं अभी भी सामान्य रूप से कल्पना फ़ोल्डर में अपने अंतर को देखना चाहता हूं, बस तब नहीं जब मैं इस 'रिलीज़' को अलग कर रहा हूं
मैसूर

2
@ मिस्टर: आप उस .gitattributesफ़ाइल को एक विशेष शाखा में सेट कर सकते हैं, जो केवल इस तरह के 'रिलीज़' डिफरेंशियल के लिए बनाई गई है;) उस विशेष ब्रांच को रिबास करें current_releaseऔर उसके ऊपर से अपना अंतर करें।
VONC

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

मेरे लिए काम नहीं करता है। क्या _ पथ विशेष हैं? _site/* -diff
मारियस

@ मारीअरेन्द्रियाना नहीं, '_' विशेष नहीं है। क्या आप चेक कर सकते हैं कि कौन सा gitattributes नियम उस फ़ोल्डर की फ़ाइल के लिए लागू होता है: git-scm.com/docs/git-check-attr
VonC

22

Git diff अब एक कस्टम अपवर्जन प्रारूप स्वीकार करता है: git diff -- ':(exclude)lib/*'

सावधान रहें यदि आपके पास बहुत अधिक दोहराव वाले फ़ोल्डर नाम ('/ ऐप', '/ lib', आदि) हैं, क्योंकि यह वर्तमान कार्यशील निर्देशिका और गिट रूट निर्देशिका के सापेक्ष फाइलों को बाहर कर देगा।


1
क्या आपको एक डॉट याद आ रही है, क्या यह नहीं होना चाहिए git diff -- . ':(exclude)lib/*'?
निकोलस डर्मिन

1
@ निकोलसर्मीन नहीं, हालांकि आपने जो लिखा है वह समकक्ष है। पथ का "शामिल" भाग भी वैकल्पिक है। इसलिए आप git diffआवश्यकता के बजाय अपने वर्तमान पथ के सापेक्ष हर चीज के लिए कर सकते हैंgit diff -- .
MaxPRafferty

नोट: विंडोज़ मशीनों पर, दोहरे उद्धरण चिह्नों का उपयोग करें, जैसेgit diff -- ":(exclude)lib/*"
cnlevy

पता नहीं क्यों, लेकिन मेरे लिए यह केवल डॉट के साथ काम करता है, जैसा कि @NicolasDermine द्वारा सुझाया गया है। मैं win10 पर Cmder का उपयोग करता हूं।
ओलिवव

3

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

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

git diff -- ":(exclude)thingToExclude"

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

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

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

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

कुछ सिंथेटिक चीनी लागू

git diff -- ":!/\$1/"

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

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

gde() {
    : '
        git diff exclude files or folders
        usage:
        gde fileOrFolderNameToExclude
    '
    git diff -- ":!/\$1/"
}

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