2012-05-23 11 views
100

क्या किसी निर्देशिका में किसी प्रकार की सभी फ़ाइलों को अनदेखा करने का कोई तरीका है?निर्देशिका में विस्तार की सभी फाइलों को गिटिग्नोर

** जाहिरा तौर पर Git करने के लिए कोई मतलब नहीं है, तो यह काम नहीं करता है:

/public/static/**/*.js 

विचार मनमाना नेस्टेड फ़ोल्डरों मिलान करने के लिए है।

+1

की [उप-निर्देशिका में कुछ फ़ाइलों Git-उपेक्षा, लेकिन सभी नहीं] संभव डुप्लिकेट (http://stackoverflow.com/questions/6794717/git-ignore-certain-files-in-sub -डायदेश-लेकिन-नहीं-सभी) –

उत्तर

75

यह कभी कोशिश की, लेकिन git help ignore पता चलता है कि अगर आप /public/static में *.js के साथ एक .gitignore शब्दों में कहें, यह तुम क्या चाहते हो जाएगा।

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

+3

यह सबसे अच्छा समाधान आवश्यक नहीं है। संभावित रूप से लोगों को अलग-अलग .gitignore फ़ाइलों के माध्यम से खोदने की आवश्यकता होगी ताकि यह पता चल सके कि उनकी फ़ाइल को क्यों अनदेखा किया जा रहा है। कुछ इस जानकारी को एक .gitignore फ़ाइल में repo root निर्देशिका में संग्रहीत करना पसंद करते हैं। – haren

+1

@ हारेन यह एकमात्र समाधान नहीं है - जोय का जवाब निश्चित रूप से भी मान्य है। जो कुछ भी आपके लिए सबसे अच्छा काम करता है चुनें। मैं तर्क दूंगा कि एक निर्देशिका के लिए स्थानीय नियमों को अनदेखा करना उस निर्देशिका में होना चाहिए, और वैश्विक नियम वैश्विक होना चाहिए। (इसके अलावा, यह उत्तर प्राचीन है और मुझे नहीं लगता कि ** उस समय समर्थित था)। – ptyx

47

अद्यतन: @Joey's answer पर एक नज़र डालें: गिट अब पैटर्न में ** वाक्यविन्यास का समर्थन करता है। दोनों दृष्टिकोण ठीक काम करना चाहिए।


gitignore(5) man page कहता है: पथ के रूप में एक ही निर्देशिका में .gitignore फ़ाइल से पढ़ने

पैटर्न, या किसी पेरेंट निर्देशिका में, उच्च स्तर फाइलों में पैटर्न (उच्चस्तरीय अप करने के लिए के साथ कार्य पेड़ के) फ़ाइल वाले निर्देशिका में निचले स्तर की फ़ाइलों में उन लोगों द्वारा ओवरराइड किया जा रहा है।

इसका मतलब क्या है कि अपने रेपो के किसी भी निर्देशिका में .gitignore फ़ाइल में पैटर्न कि निर्देशिका और सभी सबडायरेक्टरियों को प्रभावित करेगा है।

पैटर्न आपके द्वारा दी गई

/public/static/**/*.js 

बिल्कुल सही नहीं है, सबसे पहले, क्योंकि (जैसा कि आप सही तरीके से ध्यान दिया) ** वाक्य रचना Git द्वारा नहीं किया जाता। इसके अलावा, अग्रणी / पथनाम की शुरुआत के लिए पैटर्न को एंकर करता है। निकाला जा रहा है प्रमुख / या तो काम नहीं करेगा (तो, /public/static/*.js से मेल खाएगी /public/static/foo.js लेकिन नहीं/public/static/foo/bar.js।) , public/static/foo.js और foo/public/static/bar.js की तरह पथ मिलान। संपादित करें: केवल प्रमुख स्लैश को हटाने से काम नहीं किया जाएगा - क्योंकि पैटर्न में अभी भी एक स्लैश होता है, यह गिट द्वारा एक सादे, गैर-रिकर्सिव शैल ग्लोब के रूप में माना जाता है (धन्यवाद @Joey Hoer इसे इंगित करने के लिए)।

रूप @ptyx सुझाव दिया, तो आप फ़ाइल <repo>/public/static/.gitignore बनाने करने की जरूरत है और सिर्फ इस पैटर्न में शामिल हैं क्या:

*.js 

वहाँ, कोई प्रमुख / है, इसलिए यह पथ के किसी भी हिस्से में से मेल खाएगा, और वह पैटर्न केवल /public/static निर्देशिका और इसकी उप-निर्देशिकाओं में फ़ाइलों पर लागू किया जाएगा।

+2

यह पूरी तरह से सच नहीं है - विशेष रूप से "अग्रणी/निकालना" का हिस्सा 'सार्वजनिक/स्थिर/foo.js' और' foo/public/static/bar.js' जैसे पथों से मिलान नहीं करेगा। " गलत है। उद्धरण [दस्तावेज] (http://git-scm.com/docs/gitignore/) "यदि पैटर्न में स्लैश नहीं होता है, तो गिट इसे शैल ग्लोब पैटर्न के रूप में मानता है और पथनाम के विरुद्ध एक मैच के लिए जांच करता है .gitignore फ़ाइल के स्थान के सापेक्ष (यदि एक .gitignore फ़ाइल से नहीं है तो कार्य पेड़ के अपूर्ण के सापेक्ष)। " 'foo/public/static/bar.js' का मिलान नहीं किया जाएगा क्योंकि पैटर्न में'/'है। – joeyhoer

+0

@ जॉयहोयर टिप के धन्यवाद, मैंने तदनुसार अपना जवाब अपडेट कर दिया है। –

9

अनचाहे फ़ाइलों को अनदेखा करने के लिए बस .git/info/extrae पर जाएं। बहिष्कृत एक्सटेंशन या फ़ाइलों की सूची वाली एक फ़ाइल बहिष्कृत करें।

+0

यह भंडार के अन्य क्लोनों को नहीं लेगा जैसे कि गिटिनोरोर (निश्चित रूप से प्रतिबद्ध होने के बाद)। – jpmc26

128

ऐसा लगता है कि ** वाक्यविन्यास git के अनुसार संस्करण 1.8.2.1 के रूप में समर्थित है।

  • एक प्रमुख "**" एक स्लेश के बाद सभी निर्देशिकाओं में मैच का अर्थ है: लगातार

    दो तारक ("**") पैटर्न में पूर्ण पथ नाम के प्रति मिलान विशेष अर्थ हो सकता है। उदाहरण के लिए, "**/foo" फ़ाइल या निर्देशिका "foo" कहीं भी, एक ही पैटर्न के रूप में "foo" मेल खाता है। "**/foo/bar" फ़ाइल या निर्देशिका "bar" कहीं भी कि सीधे निर्देशिका के अंतर्गत "foo" है मेल खाता है।

  • में लगने वाला "/**" सब कुछ अंदर से मेल खाता है। उदाहरण के लिए, "abc/**" मैचों निर्देशिका के अंदर "abc" सभी फ़ाइलें, के स्थान .gitignore फ़ाइल, अनंत गहराई के साथ की तुलना में।

  • एक स्लैश लगातार दो तारों के बाद एक स्लैश मैचों शून्य या अधिक निर्देशिकाएं। उदाहरण के लिए, "a/**/b" मैच "a/b", "a/x/b" "a/x/y/b" और इतने पर।

  • अन्य लगातार तारक अमान्य माने जाते हैं।

+1

'xxx/**' और 'xxx /' के बीच क्या अंतर है? – thuzhf

+6

'xxx/**' 'xxx' के अंदर सभी फ़ाइलों और निर्देशिकाओं को लक्षित करता है जबकि' xxx/'' xxx' निर्देशिका को सीधे लक्षित करता है। यह वास्तव में केवल तभी महत्वपूर्ण होता है जब '!' के साथ पैटर्न को नकारते हैं, "फ़ाइल को फिर से शामिल करना संभव नहीं है यदि उस फ़ाइल की मूल निर्देशिका को बाहर रखा गया हो।", इसलिए 'xxx/* 'या' xxx/** 'का उपयोग करना होगा उस मामले में जरूरी हो। – joeyhoer

+1

अंतिम .meta वाली सभी फ़ाइलों को गिट द्वारा अनदेखा किया जाना चाहिए। यह कैसे काम करता है? '**। जेएस'? – Black

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