Git अनदेखी निर्देशिका और निर्देशिका / * के बीच क्या अंतर है?


108

मैं इस बारे में उलझन में हूँ कि एक निर्देशिका की सामग्री को git में अनदेखा करने का सही तरीका क्या है।

मान लें कि मेरे पास निम्न निर्देशिका संरचना है:

my_project  
     |--www  
         |--1.txt  
         |--2.txt
     |--.gitignore

इसे लगाने में क्या अंतर है:

www

और इस?

www/*

मैं यह सवाल पूछ रहा हूं इसका कारण यह है: git में, यदि कोई निर्देशिका खाली है, तो git रिपॉजिटरी में ऐसी खाली निर्देशिका को शामिल नहीं करेगा। तो मैं समाधान की कोशिश कर रहा था जो कि निर्देशिका के तहत एक अतिरिक्त .गितकी फ़ाइल जोड़ रहा है ताकि वह खाली न हो। जब मैं उस समाधान की कोशिश कर रहा था, अगर .gitignore फ़ाइल में, मैं नीचे की तरह लिखता हूं:

www
!*.gitkeep

यह काम नहीं करता है (मेरा इरादा www के तहत सभी सामग्रियों को अनदेखा करना है लेकिन निर्देशिका रखना है)। लेकिन अगर मैं निम्नलिखित कोशिश करूँ:

www/* 
!*.gitkeep

फिर यह काम करता है! इसलिए मुझे लगता है कि दोनों दृष्टिकोणों के बीच कुछ अंतर होना चाहिए।


के बीच एक साधारण अंतर binऔर bin/है कि पूर्व फ़ाइलों या फ़ोल्डरों, बाद केवल फ़ोल्डरों पर ध्यान नहीं देगा है। मुझे अंतर नहीं पताbin/*
कर्नल पैनिक

जवाबों:


203

के बीच मतभेद हैं www, www/और www/*

मूल रूप से प्रलेखन और मेरे स्वयं के परीक्षणों से, wwwफ़ाइल या निर्देशिका के साथ एक मैच ढूंढें, www/केवल एक निर्देशिका से मेल खाता है, जबकि www/*निर्देशिका और फ़ाइलों के अंदर मेल खाता है www

मैं केवल www/और www/*यहाँ के बीच के अंतरों पर चर्चा करूँगा , क्योंकि बीच के अंतर wwwऔर www/स्पष्ट हैं।

के लिए www/, git निर्देशिका को अनदेखा करता wwwहै, जिसका अर्थ है कि git अंदर भी नहीं दिखेगा। लेकिन www/*, git सभी फ़ाइलों / फ़ोल्डरों को अंदर चेक करता है www, और पैटर्न के साथ उन सभी को अनदेखा करता है *। ऐसा लगता है कि समान परिणामों का नेतृत्व करने के बाद से जीआईटी एक खाली फ़ोल्डर को ट्रैक नहीं करेगा wwwयदि उसके सभी बच्चे फ़ाइलों / फ़ोल्डरों को नजरअंदाज कर दिया जाता है। और वास्तव में परिणाम ओपी के मामले के साथ www/या www/*स्टैंडअलोन के लिए कोई अंतर नहीं होंगे । लेकिन अगर यह अन्य नियमों के साथ संयुक्त है, तो यह अंतर करता है।

उदाहरण के लिए, क्या होगा यदि हम केवल शामिल करना चाहते हैं, www/1.txtलेकिन अंदर अन्य सभी को अनदेखा करते हैं www?

निम्नलिखित .gitignoreकाम नहीं करेगा।

www/
!www/1.txt

जबकि निम्नलिखित .gitignoreकाम करता है, क्यों?

www/*
!www/1.txt

पूर्व के लिए, git केवल निर्देशिका को अनदेखा करता है www, और www/1.txtफिर से शामिल करने के लिए अंदर भी नहीं देखेगा । पहला नियम मूल निर्देशिका को बाहर करता है , wwwलेकिन नहीं www/1.txt, और परिणामस्वरूप www/1.txt" फिर से शामिल नहीं किया जा सकता "।

लेकिन बाद के लिए, git पहले सभी फाइलों / फॉलोवर्स को अनदेखा करता है www, और फिर उनमें से एक को फिर से शामिल करता है जो कि है www/1.txt

इस उदाहरण के लिए, दस्तावेज़ीकरण में फ़ॉलविंग लाइनें मदद कर सकती हैं:

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


क्या आपको नहीं लगता कि www/1.txtऔर फिर www/दूसरे दृष्टिकोण के समान होगा ...
नावेद बट

8

मैं सिर्फ प्रलेखन के माध्यम से पार्स कर रहा हूं, और जहां तक ​​मैं बता सकता हूं कि वे केवल अधिक उन्नत पैटर्न में भिन्न हैं, उदाहरण के लिए

$ cat .gitignore
    # exclude everything except directory foo/bar
    /*
    !/foo
    /foo/*
    !/foo/bar

मैंने उपरोक्त परीक्षण किया था , और यदि आप के !/fooसाथ प्रतिस्थापित करते हैं !/foo/*, तो आप वास्तव में एक अलग परिणाम प्राप्त करते हैं।

ध्यान दें

foo

किसी भी फ़ाइल को बाहर कर देगा foo, लेकिन

foo/

केवल फू नाम की निर्देशिका को बाहर करेगा।


3

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

इसलिए यदि आप अंदर की सभी फाइलों को नजरअंदाज करना चाहते हैं www, लेकिन wwwकिसी खाली .gitkeep, .dummyया जो भी नाम चुनते हैं, उसका उपयोग करने के बजाय .gitignore, सभी फाइलों को नजरअंदाज करते हुए, वहां मौजूद फ़ोल्डर का चयन करें।

/
|- .gitignore   (a)
\- www
    |- .gitignore   (b)
    |- 1.jpg
    \- 2.jpg

रूट .gitignore(ए) में, आप wwwफ़ोल्डर या उसकी सामग्री के बारे में कुछ नहीं कहते हैं।

में www/.gitignore(ख) आप निम्नलिखित डाल:

# ignore all files in this folder except this .gitignore
*
!.gitignore

इस तरह सब कुछ अधिक व्यवस्थित दिखता है (कम से कम मेरे लिए)।


1

एक निर्देशिका में सब कुछ अनदेखा करने के लिए डॉटफ़ाइल्स को छोड़कर आप अपने में निम्न ग्लोब-पैटर्न का उपयोग कर सकते हैं .gitignore:

www/[^.]*

तो एक अतिरिक्त के लिए कोई ज़रूरत नहीं है .gitignore, बस .keepअपनी wwwनिर्देशिका में एक फ़ाइल जोड़ें ।

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