.Itignore द्वारा कौन सी विशिष्ट फ़ाइलों को अनदेखा किया जाता है यह दिखाने के लिए Git कमांड


645

मैं अपने पैरों को गीट से गीला कर रहा हूं और निम्नलिखित समस्या है:

मेरा प्रोजेक्ट सोर्स ट्री:

/
|
+--src/
+----refs/
+----...
|
+--vendor/
+----...

मेरी विक्रेता शाखा में मेरे पास कोड (वर्तमान में MEF) है जिसे मैं वहां संकलित करूंगा और फिर उन संदर्भों को स्थानांतरित /src/refsकरूंगा जहां परियोजना उन्हें चुनती है।

मेरा मुद्दा यह है कि मुझे .gitignoreअनदेखा करने के लिए मेरा सेट है *.dllऔर *.pdb। मैं git add -f bar.dllअनदेखा किए गए फ़ाइल को जोड़ने के लिए मजबूर करने के लिए एक कर सकता हूं जो ठीक है, समस्या यह है कि मैं यह पता लगाने के लिए क्या फाइलें मौजूद नहीं हैं कि अनदेखी की गई है।

मैं यह सुनिश्चित करने के लिए अनदेखा फ़ाइलों को सूचीबद्ध करना चाहता हूं कि मैं उन्हें जोड़ना नहीं भूलता।

मैंने मैन पेज को पढ़ा है और मैं git ls-filesइसे काम नहीं कर सकता। यह मुझे लगता है कि मुझे जो git ls-files --exclude-standard -iचाहिए वह करना चाहिए। मैं क्या खो रहा हूँ?


12
इन दिनों, आप git-ls-files का उपयोग नहीं करेंगे, बल्कि 'git ls-files'
wojo

7
मैं आपसे निवेदन करता हूं कि रियाद के जवाब को सही मानें, क्योंकि केवल वही है जो मानता है कि केवल प्रदर्शन के तौर पर केवल git कमांड ( ट्रिक सहित ) का उपयोग करके ऐसा करने की कोई गारंटी नहीं है । इसके अलावा, मैं आपके सारांश में "बहिष्कृत से" उदाहरण के खिलाफ सलाह देता हूं क्योंकि यह तथ्यात्मक रूप से किसी भी .gitignore फ़ाइलों पर ध्यान नहीं देता है। मैं इसे विशेष रूप से पूछता हूं क्योंकि यह पृष्ठ Google की शीर्ष प्रतिक्रिया है। git clean
अलेक्जेंडर बर्ड

"क्या काम करता है" का सारांश "क्विक पॉइंट:" गिट ls- फाइल "मैन पेज बताता है कि" -i "का अर्थ है ls आउटपुट के लिए शामिल नहीं की गई फाइलें। मुझे वही गलतफहमी हुई, जब तक मैंने 'इसे धीरे-धीरे' नहीं पढ़ा। ;-)
होगा

2
उत्तरों को उत्तर पोस्ट में जाना चाहिए और प्रश्न को संपादित करने में नहीं।
फ़्लिम

मेरे पास है git config --global alias.ls ls-files --exclude-standard, और इस प्रश्न का उत्तर बनाता है git ls -i
jthill

जवाबों:


662

टिप्पणियाँ:


यह भी दिलचस्प है ( क्यूवर्टम के उत्तर में उल्लिखित ), आप git check-ignore -vकम से कम यूनिक्स पर ( सीएमडी विंडोज सत्र में काम नहीं करता है ) कमांड का उपयोग कर सकते हैं

git check-ignore *
git check-ignore -v *

दूसरा वाला वास्तविक नियम प्रदर्शित करता है, .gitignoreजो आपके गिट रेपो में एक फाइल को नजरअंदाज कर देता है।
यूनिक्स पर, " वर्तमान निर्देशिका में सभी फ़ाइलों का पुनरावर्ती रूप से विस्तार क्या है? " और bash4 +:

git check-ignore **/*

(या एक find -execकमांड)

नोट: https://stackoverflow.com/users/351947/Rafi B. टिप्पणी में सुझाव दिया गया है कि (जोखिम भरा) बब्बर से बचने के लिए :

git check-ignore -v $(find . -type f -print)

.git/यद्यपि सबफ़ोल्डर से फ़ाइलों को बाहर करना सुनिश्चित करें ।


मूल उत्तर 42009)

git ls-files -i

काम करना चाहिए, सिवाय इसके स्रोत कोड इंगित करता है:

if (show_ignored && !exc_given) {
                fprintf(stderr, "%s: --ignored needs some exclude pattern\n",
                        argv[0]);

exc_given ?

यह -iवास्तव में कुछ भी सूची के बाद एक और पैरामीटर की जरूरत है यह पता चला है :

प्रयत्न:

git ls-files -i --exclude-from=[Path_To_Your_Global].gitignore

(लेकिन यह केवल आपके कैश्ड (गैर-उपेक्षित) ऑब्जेक्ट को एक फिल्टर के साथ सूचीबद्ध करेगा , ताकि आप जो चाहते हैं वह काफी न हो)


उदाहरण:

$ cat .git/ignore
# ignore objects and archives, anywhere in the tree.
*.[oa]
$ cat Documentation/.gitignore
# ignore generated html files,
*.html
# except foo.html which is maintained by hand
!foo.html
$ git ls-files --ignored \
    --exclude='Documentation/*.[0-9]' \
    --exclude-from=.git/ignore \
    --exclude-per-directory=.gitignore

वास्तव में, मेरी 'gitignore' फ़ाइल (जिसे 'बहिष्कृत' कहा जाता है) में, मुझे एक कमांड लाइन मिलती है जो आपकी मदद कर सकती है:

F:\prog\git\test\.git\info>type exclude
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~

इसलिए....

git ls-files --others --ignored --exclude-from=.git/info/exclude
git ls-files -o -i --exclude-from=.git/info/exclude

git ls-files --others --ignored --exclude-standard
git ls-files -o -i --exclude-standard

चाल चलनी चाहिए।

के रूप में में उल्लेख किया ls-फ़ाइलें आदमी पेज , --othersआपको गैर-कैश को दिखाने के लिए, गैर प्रतिबद्ध, सामान्य रूप से नज़रंदाज़ फाइलों में, महत्वपूर्ण हिस्सा है।

--exclude_standardकेवल एक शॉर्टकट नहीं है, बल्कि सभी मानक "उपेक्षित पैटर्न" सेटिंग्स को शामिल करने का एक तरीका है ।

exclude-standard
: मानक Git बहिष्करण जोड़ें .git/info/exclude, .gitignoreप्रत्येक निर्देशिका में, और user's global exclusion file


@VCC, इन परीक्षणों की मेरी समझ से , आपके द्वारा सबसे ऊपर सुझाए गए उत्तर में बड़ी खामियां हो सकती हैं। इसलिए मैं सामान्य रूप से इसके बजाय रियाद के जवाब की सिफारिश करूंगा ।
अलेक्जेंडर बर्ड

2
चूंकि git v2.13.2 रिलीज़: git status --ignoredलगता है कि यह भी बिना पढ़ी हुई फाइलें दिखाती है: github.com/git/git/blob/master/Documentation/RelNotes/…
Pau

1
वाह, git check-ignore -v *बहुत अच्छा काम करता है, क्योंकि यह दिखाता है कि कॉन्फ़िगरेशन कहाँ लागू है। धन्यवाद।
होआंग ट्रान

@MikeD * / काम करने के लिए (या वास्तव में, आप बस ** कर सकते हैं) आपको ग्लोबस्टार को सेट करने की आवश्यकता है उसके shopt -s globstarबाद काम करना चाहिए।
वेद

सक्षम (जोखिम भरा) ग्लोबस्टार के बिना:git check-ignore -v $(find . -type f -print)
रफ़ी

481

इसे करने का एक बहुत ही सरल तरीका है (git 1.7.6+):

git status --ignored

देखें । .ignignore फ़ाइलों के प्रभावों को अनदेखा करने के लिए git-status बताने का कोई तरीका है?


3
आप किस संस्करण का उपयोग कर रहे हैं? मेरा (1.7.0.4) का कहना है error: unknown option 'ignored'। यहां तक ​​कि -sजुड़े हुए पोस्ट में सुझाव के अनुसार काम नहीं किया।
अलेक्जेंडर बर्ड

3
मेरा संस्करण 1.7.6 है। एक और संस्करण 1.7.5.1 वह है जिसकी आवश्यकता है -s। आप यह git status -hदेखने की कोशिश कर सकते हैं कि --ignoredक्या समर्थित है
पेंघे गेंग

1
मुझे लगता है कि बस 1.7.0.4 में अभी तक समर्थित नहीं है। मेरे अन्य कंप्यूटर में 1.7.9 है और
अलेक्जेंडर बर्ड

4
मैंने इस पृष्ठ पर हर समाधान की कोशिश की। यह सबसे अच्छा है। यह फ़ाइलों और निर्देशिकाओं दोनों को दिखाता है। मूल रूप से यह प्रश्न पूछे जाने पर यह सुविधा उपलब्ध नहीं थी। (वैसे, जब तक आप कम से कम परिवर्तनों का मंचन नहीं करते हैं, तब तक सभी समाधान एक नए "गिट
इनिट

12
यह निश्चित रूप से स्वीकृत उत्तर की तुलना में बहुत बेहतर है। यह git clean -ndXसमाधान की तुलना में बहुत अधिक सुरक्षित है , क्योंकि दुर्लभ स्थिति जब गलती से झंडे भूल जाते हैं, तो रिपॉजिटरी पर एक अपरिवर्तनीय प्रभाव पड़ेगा, क्योंकि अनट्रैक की गई फाइलें हटा दी जाती हैं। तो यह खतरनाक है। इसके विपरीत git status --ignored, हमेशा सुरक्षित होता है, भले ही गलती से टाइप किया गया हो और यह याद रखना स्वाभाविक है।
आयोनिस फिलिपिपिडिस

400

एक और विकल्प जो बहुत साफ है (कोई सज़ा नहीं है।):

git clean -ndX

स्पष्टीकरण:

$ git help clean

git-clean - Remove untracked files from the working tree
-n, --dry-run - Don't actually remove anything, just show what would be done.
-d - Remove untracked directories in addition to untracked files.
-X - Remove only files ignored by Git.

नोट: यह समाधान पहले से हटाए गए फ़ाइलों को नजरअंदाज नहीं करेगा।


निफ्टी ... हालाँकि मैंने मूल प्रश्न पूछा था, ताकि मैं यह सुनिश्चित कर सकूँ कि वेंडर फाइलें (* .dll) जो वहाँ होनी चाहिए थीं ... इसलिए उन्हें हटाना वांछित परिणाम नहीं होगा। कैसे: यह जानने के लिए अच्छा है क्योंकि मैंने अपनी रणनीति को अनदेखा करने से बदल दिया है। * अपने बिल्ड आउटपुट फ़ोल्डर (लेकिन मेरे विक्रेता फ़ोल्डर) को अनदेखा करने के लिए। यह एक अच्छा विकल्प होगा make cleanऔर एक बिल्ड सर्वर पर बहुत मददगार होगा।
एंड्रयू बर्न्स 16

2
मैं git संस्करण 1.7.0.4 का उपयोग कर रहा हूं, और दो कमांड ('git ls-files -o -i --exclude-standard', 'git clean -dXn') समतुल्य नहीं हैं। पहला मुझे 4 फाइलें दिखाता है, और दूसरा केवल दो। (.itignore ~, index.php ~, sql / create_users.sql ~, www / index.php ~) (हटाएंगे। .ignignore ~, हटाएगा index.php ~)। क्या मुझे यहाँ कुछ याद आ रहा है?
सीज़र

@VonC, मीठा! धन्यवाद! @ सीजर, मुझे यकीन नहीं है। मैं इतना परिचित नहीं हूँ git ls-files -o -i --exclude-standardgit clean -dXnहमेशा वही रहा है जो मैं चाहता था लेकिन पहले से हटाए गए फ़ाइलों को अनदेखा नहीं करता। git ls-files -o -i --exclude-standardऐसा कर सकते हैं। तो, यही वह अंतर हो सकता है।
ma11hew28

3
एक छोटी सी बात - यह nपहले से टाइप करने के लिए एक अच्छा विचार हो सकता है , गलती से उस रास्ते को हटाने की कम संभावना; git clean -ndX
टोबियास कोहेन

1
@TobiasCohen अच्छा है! मैंने आपके सुझाव के साथ उत्तर को अपडेट किया। यह सुरक्षित है। यद्यपि, यदि आप बाहर निकलते हैं n, तो Git चूक करता है fatal: clean.requireForce defaults to true and neither -n nor -f given; refusing to clean। अभी भी बहुत सुरक्षित है, लेकिन nपहले टाइप करना और भी सुरक्षित है! :)
ma11hew28

39

जबकि आम तौर पर आपका समाधान सभी परिस्थितियों में काम नहीं करता है। रेपो डिर को इस तरह मानें:

# ls **/*                                                                                                       
doc/index.html  README.txt  tmp/dir0/file0  tmp/file1  tmp/file2

doc:
index.html

tmp:
dir0  file1  file2

tmp/dir0:
file0

और इस तरह .gitignore:

# cat .gitignore
doc
tmp/*

यह docनिर्देशिका और सभी फ़ाइलों को अनदेखा करता है tmp। Git उम्मीद के मुताबिक काम करता है, लेकिन नजरअंदाज की गई फाइलों को सूचीबद्ध करने के लिए दी गई कमांड नहीं है। चलो क्या कहना है पर एक नज़र है:

# git ls-files --others --ignored --exclude-standard                                                            
tmp/file1
tmp/file2

सूचना जो docसूची से गायब है। आप इसे प्राप्त कर सकते हैं:

# git ls-files --others --ignored --exclude-standard --directory                                                
doc/

अतिरिक्त --directoryविकल्प पर ध्यान दें।

मेरी जानकारी से कोई नहीं है एक ही बार में सभी को नजरअंदाज कर दिया फ़ाइलों को सूचीबद्ध करने के लिए आदेश। लेकिन मुझे नहीं पता कि आखिर क्यों tmp/dir0नहीं दिखा।


2
यह मुझे वह मिला जो मैं चाहता था, जबकि अन्य ने नहीं किया (मेरे विशेष मामले के लिए) ... धन्यवाद! यह दो आदेशों को चलाने के लिए निराशा होती है, लेकिन एक उपेक्षित निर्देशिका के साथ, -निर्देशन विकल्प कम से कम मुझे ऐसा लगता है, और मैं फ़ाइलों को खोजने के लिए एक खोज आदेश में पाइप कर सकता हूं। धन्यवाद!
'11

यह सब एक बार में करता है, और निर्देशिकाओं का विस्तार करता है:(git ls-files -oi --exclude-standard; git ls-files -oi --exclude-standard --directory) | perl -nle '$seen{$_}++||next;if(-d){system"find",$_,"-type","f"}else{print}'
डी न्यूकुम

17

Git में अब यह कार्यक्षमता अंतर्निहित है

git check-ignore *

बेशक आप ग्लोब को **/*.dllअपने मामले में कुछ बदल सकते हैं

Git संदर्भ


7
git check-ignore **/*उपनिर्देशिकाओं में फाइलें शामिल करने के लिए
mzimmer

यह केवल शीर्ष स्तर के डाइकिटरीज को सूचीबद्ध करता है।
Radon8472

13

इसका उपयोग करने के लिए पर्याप्त होना चाहिए

git ls-files --others -i --exclude-standard

जैसा कि सब कुछ कवर करता है

git ls-files --others -i --exclude-from=.git/info/exclude

इसलिए बाद बेमानी है।


आप अपनी ~/.gitconfigफ़ाइल में एक उपनाम जोड़कर इसे आसान बना सकते हैं :

git config --global alias.ignored "ls-files --others -i --exclude-standard"

अब आप केवल git ignoredसूची देख सकते हैं। याद रखना बहुत आसान है, और तेजी से टाइप करना है।

यदि आप जेसन गेंग के समाधान के अधिक रसीले प्रदर्शन को पसंद करते हैं, तो आप इसके लिए एक उपनाम जोड़ सकते हैं:

git config --global alias.ignored "status --ignored -s"

हालाँकि, अधिक वर्बोज़ आउटपुट आपकी .gitignore फ़ाइलों के साथ समस्याओं के निवारण के लिए अधिक उपयोगी है, क्योंकि यह प्रत्येक एकल कपास-पिकिन फ़ाइल को सूचीबद्ध करता है जिसे अनदेखा किया जाता है। आप सामान्य रूप से परिणामों को पाइप के माध्यम से grepयह देखने के लिए करेंगे कि क्या आप जिस फ़ाइल को अनदेखा करने की अपेक्षा करते हैं, वह वहाँ है, या यदि आप जिस फ़ाइल को अनदेखा नहीं करना चाहते हैं वह वहाँ है।

git ignored | grep some-file-that-isnt-being-ignored-properly

फिर, जब आप केवल एक छोटा प्रदर्शन देखना चाहते हैं, तो यह याद रखना और टाइप करना काफी आसान है

git status --ignored

( -sसामान्य रूप से छोड़ा जा सकता है।)


यह मेरे लिए कभी काम नहीं किया, क्योंकि आपको उन फ़ाइलों को मैन्युअल रूप से सूचीबद्ध करना होगा। git status --ignoredडेबियन किनारे पर काम करता है, लेकिन बहुत नया हो सकता है ... लेकिन जाहिरा तौर पर यह लोकप्रिय मांग के कारण जोड़ा गया ;-)
mirabilos

1
"डेबियन किनारे पर काम करता है" द्वारा मुझे लगता है कि आपका मतलब है "डेबियन किनारे पर डिफ़ॉल्ट रूप से स्थापित गिट के संस्करण के साथ काम करता है"? आपको वास्तव में अपने आप को अपने डिस्ट्रो में शामिल उपयोगिताओं के संस्करणों द्वारा बंधक बनाए रखने से बचना चाहिए। आप उन्हें डिस्ट्रो के स्वतंत्र रूप से अपग्रेड कर सकते हैं।
आइकनोकॉस्ट

12

यहाँ काम करने वाले पेड़ों की फाइलों की पूरी सूची को प्रिंट करने का तरीका बताया गया है जो कि Git के कई gitignore स्रोतों में कहीं भी स्थित पैटर्न से मेल खाते हैं (यदि आप GNU का उपयोग कर रहे हैं find):

$ cd {your project directory}
$ find . -path ./.git -prune -o -print \
| git check-ignore --no-index --stdin --verbose

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

और यह विशेष रूप से gitignore स्रोत लाइनों की पहचान करता है।

Git कुछ फ़ाइलों में परिवर्तनों को ट्रैक करना जारी रखता है जो कि gitignore पैटर्न से मेल खाते हैं, केवल इसलिए कि उन फ़ाइलों को पहले ही जोड़ दिया गया था। उपयोगी रूप से, उपरोक्त कमांड उन फ़ाइलों को भी प्रदर्शित करता है।

निगेटिव गितिग्नोर पैटर्न भी मेल खाते हैं। हालांकि, ये लिस्टिंग में आसानी से अलग हैं, क्योंकि वे इसके साथ शुरू करते हैं !

यदि आप Windows का उपयोग कर रहे हैं, तो Git Bash में GNU शामिल है find(जैसा कि पता चला है find --version)।

यदि सूची लंबी है (और आपके पास rev) है, तो आप उन्हें विस्तार से प्रदर्शित कर सकते हैं (कुछ), भी:

$ cd {your project directory}
$ find . -path ./.git -prune -o -print \
| git check-ignore --no-index --stdin --verbose \
| rev | sort | rev

अधिक जानकारी के लिए, देखना man find, man git-check-ignore, man rev, और man sort

इस पूरे दृष्टिकोण की बात यह है कि गिट (सॉफ्टवेयर) तेजी से बदल रहा है और अत्यधिक जटिल है। इसके विपरीत, जीएनयू की findहै अत्यंत स्थिर (कम से कम, में अपनी सुविधाओं यहां इस्तेमाल किया)। इसलिए, जो कोई भी Git के अपने गहन ज्ञान को प्रदर्शित करके प्रतिस्पर्धी होने की इच्छा रखता है, वह एक अलग तरीके से प्रश्न का उत्तर देगा।

सबसे अच्छा जवाब क्या है? यह उत्तर जानबूझकर Git ज्ञान पर अपनी निर्भरता को कम करता है, प्रतिरूपकता (सूचना अलगाव) के माध्यम से स्थिरता और सरलता के लक्ष्य को प्राप्त करने की ओर, और लंबे समय तक चलने के लिए डिज़ाइन किया गया है ।


बहुत धन्यवाद! मुझे यह पता लगाने में दिक्कत हो रही थी कि मेरे कुछ नए स्रोत फाइलें कभी-कभार मेरे कमिट से गायब क्यों हैं। यह बताता है कि मेरे पास एक पैटर्न था: बिन *, कि मैंने सोचा था कि बिन के साथ शुरू होने वाली फ़ाइलों / निर्देशिकाओं के नाम केवल मेल खाते हैं, लेकिन इसके बजाय यह किसी भी चीज़ से मेल खाता है जिसमें बिन को फ़ाइल / निर्देशिका के पूर्ण पथ में शामिल किया गया है! मुझे लगता है, मेरी समस्या .gitignore से मेल खाते पैटर्न के सटीक शब्दार्थ की गलतफहमी से आती है। आपकी 2-लाइन स्क्रिप्ट ने मुझे इस गलती को खोजने में मदद की!
निकोलस रौकेट

1

(अन्य जवाबों का विस्तार)

ध्यान दें, git check-ignoreप्रतिबद्ध का उपयोग करता है .gitignoreन कि आपके काम करने वाले पेड़ में! अपने गिट इतिहास को प्रदूषित किए बिना इसके साथ खेलने के लिए, आप स्वतंत्र रूप से इसे संपादित करने की कोशिश कर सकते हैं, और फिर एक के साथ प्रतिबद्ध कर सकते हैं git commit --amend

यह समस्या मुख्य रूप से होती है यदि आपको समस्या का समाधान चाहिए, तो वह निर्देशिकाओं का पालन नहीं करता है। इसमें दर्ज करें .gitignore:

dirtokeep/**
!dirtokeep/.keep

.keepमें एक शून्य-लंबाई फ़ाइल होनी चाहिए dirtokeep

इसका परिणाम यह होगा कि सभी चीजों को dirtokeepनजरअंदाज कर दिया जाएगा, इसके अलावा dirtokeep/.keep , जिसके परिणामस्वरूप यह भी होगा कि dirtokeepनिर्देशिका का निर्माण क्लोन / चेकआउट पर किया जाएगा।


0

मान लें कि कुछ अनदेखा निर्देशिकाएं हैं, तो "गिट स्थिति नोड / लॉग /" का उपयोग क्यों न करें जो आपको बताएंगे कि कौन सी फाइलें जोड़ी जानी हैं? निर्देशिका में मेरे पास एक पाठ फ़ाइल है जो स्थिति आउटपुट का हिस्सा नहीं है, जैसे:

शाखा मास्टर पर
आपकी शाखा 'मूल / मास्टर' के साथ अद्यतित है।
अनट्रैक की गई फ़ाइलें:
("git add ..." का उपयोग करें कि इसमें क्या शामिल होगा)

    node/logs/.gitignore 

.गरिग्नोर है:

*

.जित्नागोर

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