वास्तव में .ijignore बहिष्करण नियम कैसे काम करते हैं?


146

मैं एक बड़ी निर्देशिका संरचना पर एक gitignore समस्या को हल करने की कोशिश कर रहा हूं, लेकिन अपने प्रश्न को सरल बनाने के लिए मैंने इसे निम्न में घटा दिया है।

मेरे पास एक ब्रांड नई गिट रिपॉजिटरी में दो फाइलों (फू, बार) की निम्नलिखित निर्देशिका संरचना है (अब तक कोई भी हिट नहीं):

a/b/c/foo
a/b/c/bar

जाहिर है, एक 'गिट स्थिति -u' से पता चलता है:

# Untracked files:
...
#       a/b/c/bar
#       a/b/c/foo

मैं जो करना चाहता हूं वह एक .gitignore फ़ाइल बनाता है जो / a / b / c के अंदर सब कुछ अनदेखा करता है, लेकिन फ़ाइल'oo 'को अनदेखा नहीं करता है।

अगर मैं इस तरह से .gitignore बनाता हूं:

c/

फिर 'git स्टेटस -u' फू और बार दोनों को नजरअंदाज करता है:

# Untracked files:
...
#       .gitignore

जो मुझे उम्मीद है।

अब अगर मैं फू के लिए बहिष्करण नियम जोड़ता हूं, तो:

c/
!foo

Gitignore manpage के अनुसार, मुझे काम करने की उम्मीद है। लेकिन यह नहीं है - यह अभी भी फू को नजरअंदाज करता है:

# Untracked files:
...
#       .gitignore

यह भी काम नहीं करता है:

c/
!a/b/c/foo

न ही यह:

c/*
!foo

देता है:

# Untracked files:
...
#       .gitignore
#       a/b/c/bar
#       a/b/c/foo

उस मामले में, हालांकि फू को अब नजरअंदाज नहीं किया जाता है, बार को भी नजरअंदाज नहीं किया जाता है।

.Gitignore में नियमों का क्रम भी मायने नहीं रखता है।

यह भी वह नहीं करता है जो मैं उम्मीद करता हूं:

a/b/c/
!a/b/c/foo

यह दोनों फू और बार को अनदेखा करता है।

एक स्थिति जो काम करती है वह यह है कि अगर मैं फाइल / a / b / c / .ignignore बनाता हूं और वहां डालूं:

*
!foo

लेकिन इसके साथ समस्या यह है कि अंततः एक / बी / सी के तहत अन्य उपनिर्देशिकाएं होंगी और मैं हर एक में एक अलग .gitignore नहीं रखना चाहता हूं - मैं 'प्रोजेक्ट-आधारित' बनाने की उम्मीद कर रहा था।। फ़ाइलें जो प्रत्येक प्रोजेक्ट की शीर्ष निर्देशिका में बैठ सकती हैं, और सभी 'मानक' उपनिर्देशिका संरचना को कवर कर सकती हैं।

यह भी समतुल्य प्रतीत होता है:

a/b/c/*
!a/b/c/foo

यह "काम" करने के लिए निकटतम चीज हो सकती है जिसे मैं प्राप्त कर सकता हूं, लेकिन पूर्ण सापेक्ष पथ और स्पष्ट अपवादों को कहा जाना चाहिए, जो कि अलग-अलग स्तरों में 'फू' नाम की बहुत सारी फाइलें होने पर दर्द होने वाला है। उप-वृक्ष का।

वैसे भी, या तो मैं यह नहीं समझता कि बहिष्करण नियम कैसे काम करते हैं, या वे बिल्कुल भी काम नहीं करते हैं जब निर्देशिका (वाइल्डकार्ड के बजाय) को अनदेखा किया जाता है - एक नियम में समाप्त होने से /

क्या कोई इस पर कुछ प्रकाश डाल सकता है?

वहाँ एक तरीका है gitignore इस अनाड़ी खोल आधारित वाक्यविन्यास के बजाय नियमित अभिव्यक्ति की तरह समझदार कुछ का उपयोग करने के लिए है?

मैं इसका उपयोग कर रहा हूं और इसे Cygwin / bash3 पर git-1.6.6.1 और Ubuntu / bash3 पर git-1.7.1 के साथ देख रहा हूं।


संबंधित प्रश्न: stackoverflow.com/questions/2820255/…
Cascabel

4
बहुत बढ़िया लिखा सवाल! आपने जितने मामलों की कोशिश की, वास्तव में मुझे यह समझने में मदद मिली कि मैं अपने समान मामले में क्या गलत कर रहा था। भगवान का शुक्र है, मैं आज लंबे समय से देख रहा हूं।
एलेक्स जी

जवाबों:


153
/ एक / बी / सी / *
! foo

मेरे लिए काम करने लगता है (लिनक्स पर 1.7.0.4 git)। यह *महत्वपूर्ण है क्योंकि आप निर्देशिका को अनदेखा कर रहे हैं (ताकि git अंदर नहीं दिखेगा) निर्देशिका के भीतर फ़ाइलों के बजाय (जो बहिष्करण के लिए अनुमति देता है)।

अपवर्जन के बारे में सोचें कि "लेकिन यह एक" के बजाय "है, लेकिन इसे शामिल करें" - "इस निर्देशिका को अनदेखा करें ( /a/b/c/) लेकिन यह एक ( foo) नहीं" बहुत अर्थ नहीं है; "इस निर्देशिका में सभी फ़ाइलों को अनदेखा करें ( /a/b/c/*) लेकिन यह नहीं ( foo)" करता है। मैन पेज को उद्धृत करने के लिए:

एक वैकल्पिक उपसर्ग! जो पैटर्न को नकारता है; पिछले पैटर्न द्वारा छोड़ी गई कोई भी मिलान फ़ाइल फिर से शामिल हो जाएगी।

यानी, फ़ाइल को फिर से शामिल करने के लिए पहले से ही बाहर रखा गया है। उम्मीद है कि कुछ प्रकाश डाला।


हां, आपके द्वारा दिया गया उदाहरण मेरे लिए भी ठीक काम करता है। समस्या यह है कि / a / b / * काम नहीं करता है यदि f c में है, जिसका अर्थ है कि अगर मेरे पास c (उदाहरण d /, e /, f / g / h /, i / j के तहत विभिन्न उपनिर्देशिकाओं में एकाधिक foo फाइलें हैं) /, आदि) तो नकारात्मक नियम '! फू' उन लोगों को नहीं पकड़ेगा।
द्विविवाह

1
@meowsqueak वास्तव में यह नहीं होगा। यदि आप / a / b / * को अनदेखा करते हैं, तो फू में होने के लिए कोई निर्देशिका नहीं है! यदि आप संपूर्ण निर्देशिका ट्री को / a / b के अंतर्गत अनदेखा करने का प्रयास कर रहे हैं, लेकिन "foo" नाम की कोई भी फ़ाइल शामिल करते हैं, जो पेड़ में कहीं भी हो सकती है, मुझे नहीं लगता कि यह .ignignore पैटर्न के साथ संभव है: \
क्रिस

वास्तव में यह समझा सकता है कि यह मेरे लिए काम क्यों नहीं करता है - निम्नलिखित नियम काम नहीं करते हैं: "/ a / b / *", "! C / foo"। अगर वह काम करता है, तो कोई समस्या नहीं हो सकती है।
द्विविवाह

5
"मुझे नहीं लगता कि यह .ignignore पैटर्न के साथ उल्लेखनीय है" - मुझे लगता है कि आप सही हैं, दुर्भाग्य से।
द्विविवाह

@meowsqueak आप संभवतः अनदेखा कर सकते हैं /a/b/cऔर फिर git add --forceकिसी भी मेल फ़ाइल के लिए एक हुक लिख सकते हैं पूर्व-प्रतिबद्ध या कुछ और
क्रिस

24

मेरे पास एक समान स्थिति है, मेरा समाधान उपयोग करना था:

/a/**/*
!/a/**/foo

यदि मैं **सही ढंग से पढ़ता हूं, तो इंटरमीडिएट निर्देशिकाओं की एक मनमानी संख्या के लिए काम करना चाहिए ।


6

यह निश्चित रूप से .itignore मैन पेज से स्पष्ट नहीं है। यह काम:

*
!/a
!/a/b
!/a/b/c
!/a/b/c/foo

# don't forget this one
!.gitignore

जैसा कि क्रिस ने उल्लेख किया है एक निर्देशिका भी नहीं खोली गई है अगर इसे बाहर रखा गया है। इसलिए यदि आप * लेकिन कुछ फ़ाइलों को अनदेखा करने में सक्षम होना चाहते हैं, तो आपको उन फ़ाइलों के लिए पथ बनाना होगा जो ऊपर दिए गए हैं। मेरे लिए यह सुविधाजनक है, क्योंकि मैं एक पुस्तकालय की 1 फ़ाइल पर एक कोड समीक्षा करना चाहता हूं और अगर मैं एक और बाद में करना चाहता हूं तो मैं इसे जोड़ देता हूं, और बाकी सभी को अनदेखा किया जाता है।


6

यहाँ एक और विकल्प है:

*
!/a*
!/a/*
!/a/*/*
!/a/*/*/*

यह हर फ़ाइल और निर्देशिका को अनदेखा करेगा, सिवाय फ़ाइलों / निर्देशिकाओं के तीन स्तर गहरे भीतर।


5

एक अधिक सामान्य नोट पर, git1.8.2 में एडम स्पियर्स से पैच ( इसके v4 में , कुछ स्टैक ओवरफ्लो प्रश्न द्वारा प्रेरित ) शामिल होगा , यह निर्धारित करने के बारे में कि कौन सा नियम वास्तव में आपकी फ़ाइल को अनदेखा करता है।gitignore

Git1.8.2 रिलीज़ नोट देखें और SO प्रश्न " जो gitignore नियम मेरी फ़ाइल को अनदेखा कर रहा है ":
यह कमांड होगा git check-ignore


1
इस जानकारी को प्रसारित करने के लिए धन्यवाद। check-ignoreआपको यह भी बताएगा कि कौन सा नियम आपकी फाइल को नजरअंदाज करने से रोक रहा है, अगर ऐसा है तो।
एडम स्पियर्स

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