2014-05-25 4 views
18

hello/ मेरी फ़ोल्डर संरचनाgitignore: समझौता "हैलो /" बनाम "नमस्ते/*"

hello/* केवल शीर्ष-स्तर पर फ़ोल्डर "हैलो" पर ध्यान नहीं देता में नाम "हैलो" कहीं भी सभी फ़ोल्डर ध्यान नहीं देता।

यह क्यों है? कृपया http://git-scm.com/docs/gitignore में एक मार्ग को इंगित करें जो इस व्यवहार को बताता है।

उत्तर

15

यह अजीब लग सकता है, लेकिन यह हमें कई तरीकों से निर्देशिकाओं से मेल खाने की अनुमति देता है: फ़ाइलों या निर्देशिका कहीं भी, निर्देशिका कहीं भी, या शीर्ष स्तर पर निर्देशिकाएं। यह बहुमुखी प्रतिभा बहुत उपयोगी है, और एक अव्यवस्थित .gitignore को रोकने से रोक सकता है।

(FYI करें, यदि आप Git 1.8.2+ है, तो आप git check-ignore का उपयोग इस डिबग मदद करने के लिए कर सकते हैं।)


आप foo डालें, तो वह सभी फ़ाइलों और निर्देशिकाओं foo नामित से मेल खाएगी।


आप foo/ डालें, तो वह केवल foo नामित निर्देशिका से मेल खाएगी।

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


आप * जोड़ देते हैं तो foo/* में के रूप में, यह एक फ़ाइल ग्लोब (.gitignore के सापेक्ष) माना जाता है।पैटर्न में वाइल्डकार्ड एक/पथ नाम में मेल नहीं खाएगी:

अन्यथा, Git fnmatch के उपभोग के लिए उपयुक्त एक खोल ग्लोब (3) FNM_PATHNAME ध्वज के साथ के रूप में पैटर्न व्यवहार करता है। उदाहरण के लिए, "दस्तावेज़ीकरण/*। एचटीएमएल" मिलान "दस्तावेज़ीकरण/git.html" लेकिन "दस्तावेज़ीकरण/पीपीसी/पीपीसीएचटीएमएल" या "उपकरण/perf/दस्तावेज़ीकरण/perf.html" नहीं।

इस प्रकार foo/* के लिए, Git सभी फ़ाइलों और निर्देशिकाओं शीर्ष-स्तरीय निर्देशिका foo में ध्यान नहीं देगा। यह ध्यान नहीं देगा foo/dir, foo/file.txt, आदि (तकनीकी तौर पर, इस foo ही नजरअंदाज नहीं होगा, लेकिन यह अपने बच्चों पर ध्यान नहीं देगा। हालांकि, बाद से Git निर्देशिका ट्रैक नहीं करता, यह एक ही प्रभाव पड़ता है।)

FYI करें, foo/** होगा एक ही व्यवहार है।


मेरे सिफारिश:

आप शीर्ष स्तर पर एक निर्देशिका foo अनदेखी करने के लिए चाहते हैं IMO यह इस नियम का उपयोग करने के लिए सबसे स्पष्ट है,:

में स्लैश से मेल खाता है पथनाम की शुरुआत उदाहरण के लिए, "/*.c" "cat-file.c" से मेल खाता है लेकिन "mozilla-sha1/sha1.c" नहीं।

तो तुम /foo/ लिख सकते हैं, और यह कहीं और शीर्ष-स्तर पर निर्देशिका foo उपेक्षा, लेकिन होगा।

+1

मैं वास्तव में आपके पहले के स्पष्टीकरण से प्यार करता हूं कि आपने संपादित किया: "इसका कारण: यह उपयोगकर्ताओं को तीन तरीकों से निर्देशिकाओं से मेल खाता है: फ़ाइलों या निर्देशिकाओं को कहीं भी, निर्देशिका कहीं भी, या शीर्ष स्तर पर निर्देशिकाएं।" इसके उद्देश्य का बहुत अच्छा सरल विवरण :) – stackoverflowuser

+0

@ स्टैक ओवरफ्लूसर, मैं ब्रेवटी के लिए संपादित करने की कोशिश कर रहा था। मैंने इसे वापस अंदर रखा। धन्यवाद :) –

8

प्रासंगिक मार्ग है:

Git, साथ fnmatch के उपभोग के लिए उपयुक्त एक खोल ग्लोब के रूप में पैटर्न व्यवहार करता है:

  • '*' शीर्ष फ़ाइलों के लिए
  • ' ** 'सब कुछ अंदर, अनंत गहराई के साथ

fnmatch एक ऐसा फ़ंक्शन है जो जांचता है कि स्ट्रिंग तर्क पैटर्न तर्क से मेल खाता है, जो एक शेल वाइल्डकार्ड पैटर्न है।

कि उपयोगी होता है जब एक उपेक्षा शासन से सबफ़ोल्डरों को छोड़कर, जैसा कि मैंने "How to INCLUDE lib files inside [/Libs/x64/Release] folder in a Git repository"

Libs/**/* 
!Libs/x64/Release/ 

सब कुछ पर ध्यान नहीं देता कि Libs/x64/Release फ़ोल्डर को छोड़कर में उल्लेख है।

किसी भी मामले में, आदेश git check-ignore -v जाँच करने के लिए जो .gitignore नियम किसी विशेष फ़ाइल के लिए लागू होता है बहुत उपयोगी है।

संबंधित मुद्दे