निर्देशिका में एक्सटेंशन की सभी फाइलें gitignore


192

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

** जाहिरा तौर पर अर्थहीन है, इसलिए यह काम नहीं करता है:

/public/static/**/*.js

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


जवाबों:


121

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

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


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

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

209

ऐसा प्रतीत होता है कि **सिंटैक्स प्रलेखन के अनुसार 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/?
थाउजफ

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

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

"अन्य लगातार तारांकन अमान्य माने जाते हैं।" यह सब रकम
imrok

68

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


Gitignore (5) आदमी पेज कहता है:

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

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

पैटर्न आपने प्रदान किया

/public/static/**/*.js

काफी सही नहीं है, सबसे पहले क्योंकि (जैसा कि आपने सही ढंग से नोट किया है) **सिंटैक्स का उपयोग गिट द्वारा नहीं किया जाता है। इसके अलावा, अग्रणी /एंकर जो पथनाम की शुरुआत में पैटर्न करते हैं। (तो, /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
यह पूरी तरह सच नहीं है - विशेष रूप से भाग "अग्रणी /को हटाने से या तो काम नहीं करेगा, जैसे मिलान पथ public/static/foo.jsऔर foo/public/static/bar.js।" गलत है। प्रलेखन को उद्धृत करने के लिए "यदि पैटर्न में स्लैश / नहीं है, तो गिट इसे शेल ग्लोब पैटर्न के रूप में मानता है और .nameignore फ़ाइल के स्थान पर काम के पेड़ के स्थान के सापेक्ष pathname के खिलाफ मैच के लिए जाँच करता है। एक .itignore फ़ाइल से नहीं) ”। foo/public/static/bar.jsमिलान नहीं किया जाएगा क्योंकि पैटर्न में ए शामिल है /
जोयोहेर

@JoeyHoer टिप के लिए धन्यवाद, मैंने तदनुसार अपना उत्तर अपडेट कर दिया है।
एडम शार्प

9

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


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

3

मेरा मानना ​​है कि सबसे सरल समाधान का उपयोग करना होगा find। मुझे .gitignoreउप-निर्देशिकाओं में कई तरह के घूमने पसंद नहीं हैं और मैं एक अद्वितीय, शीर्ष-स्तर का प्रबंधन करना पसंद करता हूं .gitignore। ऐसा करने के लिए आप बस मिली हुई फाइलों को अपने साथ जोड़ सकते हैं .gitignore। मान लीजिए कि /public/static/आपका प्रोजेक्ट / घर है तो मैं कुछ इस तरह उपयोग करूंगा:

find . -type f -name *.js | cut -c 3- >> .gitignore

मैंने पाया कि ./शुरुआत में काटने के लिए अक्सर यह समझना आवश्यक है कि कौन सी फाइलों से बचना है। इसलिए ए cut -c 3-

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