2016-01-20 4 views
13

यहां मेरी वर्तमान निर्देशिका की सामग्री है।क्या पैटर्न करता है .gitignore का पालन करें?

$ ls 
foo.foo 
$ ls -a 
. .. .bar.foo .foo foo.foo .gitignore 

फिर मैं इस निर्देशिका को एक गिट भंडार में बदल देता हूं।

$ git init 
Initialized empty Git repository in /home/lone/foo/.git/ 
$ ls -a 
. .. .bar.foo .foo foo.foo .git .gitignore 

यहां .gitignore की सामग्री है।

$ cat .gitignore 
*.foo 

मुझे लगता है कि .gitignore में पैटर्न खोल में एक ही पैटर्न से अलग ढंग से व्यवहार करता है। शेल *.foo केवल गैर-छिपी हुई फाइलों से मेल खाता है, यानी फ़ाइल नाम जो एक अवधि से शुरू नहीं होते हैं।

$ echo *.foo 
foo.foo 

लेकिन *.foo.gitignore में किसी भी फाइल, छिपा या गैर छिपा है, जो .foo साथ समाप्त होता है मिलान करने के लिए लगता है।

$ git status 
On branch master 

Initial commit 

Untracked files: 
    (use "git add <file>..." to include in what will be committed) 

     .gitignore 

nothing added to commit but untracked files present (use "git add" to track) 

मैं कहाँ पैटर्न कि .gitignore इस प्रकार की सटीक परिभाषा के बारे में अधिक सीख सकते हैं, जिससे कि मैं समझ सकता है, जहां और क्यों अपने व्यवहार खोल ग्लोब पैटर्न से भिन्न?

+3

यहां एक संसाधन है: https://git-scm.com/docs/gitignore। कुछ स्थितियों के तहत इसे एक शैल ग्लोब की तरह माना जाता है। "अन्यथा, गिट एफएनएम_PATHNAME ध्वज के साथ fnmatch (3) द्वारा उपभोग के लिए उपयुक्त शेल ग्लोब के रूप में पैटर्न का व्यवहार करता है" (लेकिन जब यह नहीं करता है तब इसके ऊपर की सामग्री को पढ़ें) – hiandbaii

+0

@hiandbaii मैंने इस प्रश्न को पूछने से पहले उस दस्तावेज़ को पढ़ा । हालांकि, कुछ चीजें मुझे स्पष्ट नहीं हैं। क्या शैल ग्लोब पैटर्न को संसाधित करने के लिए 'fnmatch (3)' का भी उपयोग करता है? उस स्थिति में ''' '' '' से पहले शून्य वर्णों से मेल नहीं खाता है (यानी छिपी हुई फाइलें) लेकिन गिटिनोरोर करता है? मैं 'gitignore' दस्तावेज़ में सटीक अनुभाग नहीं ढूंढ पा रहा हूं जो इसे समझाता है। –

उत्तर

9

gitignore उपयोग glob convention इस प्रकार है: पैटर्न में वाइल्डकार्ड:

Git साथ FNM_PATHNAME flagfnmatch(3) के उपभोग के लिए उपयुक्त एक खोल ग्लोब के रूप में पैटर्न व्यवहार करता है पथनाम में / से मेल नहीं खाएगा।

उदाहरण के लिए, "Documentation/*.html" मैचों "Documentation/git.html" लेकिन "Documentation/ppc/ppc.html" या "tools/perf/Documentation/perf.html" नहीं।

OP Lone Learner पूछता in the comments:

खोल भी fnmatch(3) ग्लोब पैटर्न पर कार्रवाई करने के उपयोग करता है?
उस मामले में * क्यों शून्य अक्षरों से मेल नहीं खाता है। (यानी छिपी हुई फाइलें) लेकिन गिटिनोरोर करता है?

क्योंकि यह shell configuration choice है।

प्रकार (, shopt का उपयोग कर जो specific to bash है):

shopt -s dotglob 
echo *.foo 
.foo foo.foo 

कि dotglob

उपयोग कर रहा है सेट, बैश filename expansion के परिणामों में से एक '.' शुरुआत फ़ाइल नाम शामिल है । (pattern matching के लिए)

3

.gitignore बस उस पैटर्न के लिए प्रविष्टियां हैं जो आप चाहते हैं गिट ट्रैक करने के लिए नहीं (वाइल्डकार्ड समर्थन)।

यह कॉन्फ़िगरेशन फ़ोल्डर स्तर पर संग्रहीत है।
वहां आप निर्दिष्ट कर सकते हैं कि कौन सी फ़ाइल अनदेखा करनी है।
यह फ़ाइल सभी उपफोल्डरों पर एक पुनरावर्ती तरीके से लागू होगी।

.gitignore विनिमेय तरीके से जानकारी एकत्रित कर रहा है:

  • System level - (ग्लोबल) उदाहरण के लिए यदि आप एक यूनिक्स उपयोगकर्ता हैं और आप अपने सभी परियोजनाओं के लिए सभी *.so फ़ाइलों को अनदेखा करना चाहते हैं तो आप करेंगे इसे वैश्विक फ़ाइल

  • स्थानीय - आमतौर पर दिए गए प्रोजेक्ट की सभी सामग्री के लिए आवेदन करने वाले प्रोजेक्ट स्तर पर होगा।

  • प्रति फ़ोल्डर - दिए गए फ़ोल्डर के लिए विशिष्ट परिभाषा (उदाहरण के लिए -, पासवर्ड फ़ाइल को अनदेखा लॉग फ़ाइल आदि या किसी अन्य संसाधन पर ध्यान नहीं देना चाहते हैं)

भी एक विन्यास संपत्ति core.excludesfile नहीं है जो आपको उपयोग करने के लिए एक अनदेखा फ़ाइल सेट करने की अनुमति देता है।

git config --global core.excludesfile ~/.gitignore

तुम भी जो फ़ाइलें फ़ाइल से पहले ! जोड़कर अनदेखी करने के लिए नहीं है, तो यह नजरअंदाज नहीं किया किया जाएगा निर्दिष्ट कर सकते हैं (वाइल्डकार्ड जो इस्तेमाल किया जा सकता के बारे में नीचे और अधिक पढ़ें)।

वाक्यविन्यास के बारे में जानने के लिए आप इसके बारे में here पढ़ सकते हैं।
आप इस फ़ाइल को gitignore.io के लिए उत्पन्न करने के लिए तीसरे भाग टूल का उपयोग कर सकते हैं।


मैं क्या पेज में नहीं पा सके बताते हैं कि * शून्य या अधिक से मेल खाता है और छिपी हुई फ़ाइलें भी

फ़ाइल की प्रत्येक पंक्ति निम्न वाइल्डकार्ड के साथ किसी भी पैटर्न शामिल कर सकते हैं मेल खाता है :

? = दिए गए पैटर्न के शून्य या एक घटना से मेल खाता है।
* = दिए गए पैटर्न की शून्य या अधिक घटनाएं मेल खाते हैं।
+ = दिए गए पैटर्न की एक या अधिक घटनाओं से मेल खाता है।
@ = दिए गए पैटर्न में से एक मिलान करता है।
! = दिए गए पैटर्न में से किसी एक को छोड़कर कुछ भी मेल खाता है।


अपनी टिप्पणी में आप * पैटर्न के बारे में जानकारी के लिए कहा।

यहां आप देख सकते हैं कि * सभी फ़ाइलों को अनदेखा करें। गिट परवाह नहीं है अगर यह एक छिपी हुई फाइल है या नहीं। यह बस मिलान पैटर्न की तलाश में है।

enter image description here

के रूप में Git ऊपर बताया गया है, इसलिए यदि आप एक आंतरिक फ़ोल्डर में फ़ाइलें उपेक्षा करना चाहते हैं आप आंतरिक फ़ोल्डर निर्दिष्ट करने के लिए होगा पैटर्न आप .gitignore फ़ाइल में आपूर्ति मैच के लिए प्रयास करें। यहां फ़ोल्डर सामग्री का एक डेमो और आंतरिक फ़ाइलों को अनदेखा करना है। आप देख सकते हैं कि आंतरिक फ़ोल्डर aa फ़ाइल अंदर है लेकिन चूंकि अनदेखी फ़ाइल में **/ पैटर्न है, यह सभी आंतरिक फ़ोल्डर्स और फ़ाइलों को अनदेखा कर देगा। '*' की

enter image description here

+0

मैंने इस प्रश्न पूछने से पहले उस दस्तावेज को पढ़ा था। मुझे यह नहीं मिला कि पृष्ठ में क्या बताया गया है कि '*' शून्य या अधिक वर्णों से मेल खाता है और छिपी हुई फाइलों से मेल खाता है। –

+0

वाइल्डकार्ड तारांकन के बारे में अधिक जानकारी जोड़ा गया। यह पूछने के लिए स्वतंत्र महसूस करें कि कुछ अभी भी स्पष्ट नहीं है – CodeWizard

+1

अंगूठे गिट के नियम के रूप में किसी दिए गए फ़ोल्डर संरचना (लिनक्स या विंडोज) में सभी फ़ाइलों को स्नीफ करता है और डिफ़ॉल्ट रूप से उन्हें स्रोत नियंत्रण में शामिल नहीं किया जाता है जब तक उन्हें स्पष्ट रूप से .gitignore में अनदेखा नहीं किया जाता है। इस मामले में, नियम छुपा और दृश्यमान दोनों फ़ोल्डर्स पर लागू होगा। तब से * शून्य या अधिक वर्णों से मेल खाता है ... मैंने व्यक्तिगत रूप से गिट चश्मे या सभी दस्तावेज नहीं पढ़े हैं, लेकिन मुझे लगता है कि अंतर्निहित फाइल सिस्टम के व्यवहार से विशेष रूप से लिनक्स पर कुछ चीजें अनुमानित की जा सकती हैं। – Eniola

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