जब gitignore में अग्रणी स्लैश का उपयोग करें


108

मैं अधिक स्पष्ट रूप से .gitignoreवाक्य रचना को समझने की कोशिश कर रहा हूं , और विशेष रूप से जहां तक https://github.com/github/gitignore gitignores का संबंध है।

मैं देख रहा हूं कि अग्रणी स्लैश का उपयोग .gitignoreफ़ाइल के स्थान के सापेक्ष केवल पथनाम से मेल खाने के लिए किया जाता है ( http://git-scm.com/docs/gitignore से ):

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

लेकिन क्या होता है जब मैं अग्रणी स्लैश को हटा देता हूं? जहाँ तक मैंने समझा, दो मामले हैं:

  1. यदि पैटर्न में स्लैश नहीं है (या इसमें केवल अनुगामी स्लैश है, जिसका अर्थ है कि यह एक निर्देशिका से मेल खाना चाहिए), खोज पूरी निर्देशिका ट्री के अंदर की जाती है। उदाहरण के लिए, पैटर्न dir/से मेल खाएगी <root>/dir, <root>/a/dir, <root>/a/b/c/.../dir, आदि, जहां <root>का स्थान है .gitignoreफ़ाइल।
  2. यदि पैटर्न में एक स्लैश है, जो अनुगामी स्थिति में नहीं है (यह अंतिम वर्ण नहीं है), तो यह केवल .gitignoreफ़ाइल स्थान के सापेक्ष पथनाम के साथ मेल खाता है ।

इस व्यवहार को जांचने के लिए मैंने ये उदाहरण दिए हैं:

# Directory structure:
<root>
├─ dir/
│   └─ test
├─ src/
│   ├─ dir/
│   │   └─ test
test file is there only because Git does not track empty directories.

पहला परीक्षण:

# .gitignore
dir/

# git status
nothing to commit

इसलिए Git दोनों dirनिर्देशिकाओं को अनदेखा कर रहा है । यह केस नंबर 1 के अनुरूप है: पैटर्न में कोई स्लैश नहीं है (केवल अनुगामी को छोड़कर), इसलिए Git पूरे डायरेक्टरी ट्री को देख रहा है, जो पैटर्न से मेल खाता है सब कुछ अनदेखा कर रहा है।

दूसरा परीक्षण:

# .gitignore
/dir/

# git status
Untracked files:
    src/

यहां, Git dirरूट डायरेक्टरी के नीचे केवल डायरेक्ट्री को अनदेखा कर रहा है, पैटर्न में अग्रणी स्लैश के लिए।

तीसरा परीक्षण:

# .gitignore
dir/*

# git status
Untracked files:
    src/

यह केस नंबर 2 के अनुरूप है: पैटर्न में इसके अंदर कुछ स्लैश है, इसलिए इसे रूट डायरेक्टरी से शुरू होने वाला एक मार्गनाम माना जाता है।

अब असली सवाल का समय है। आइए इस gitignore फ़ाइल पर विचार करें : जब वे निर्देशिका को अनदेखा करते हैं downloader/, उदाहरण के लिए, क्या वे वास्तव downloaderमें पूरे निर्देशिका पेड़ में पाए जाने वाले हर एक निर्देशिका को अनदेखा नहीं कर रहे हैं ? यह वही है जो मैंने सोचने के लिए प्रेरित किया है कि मैंने पहले गिट के कामकाज के बारे में क्या देखा था।

तो अगर मैं downloaderइसके अंदर एक निर्देशिका के साथ एक कस्टम मॉड्यूल है, यह अप्रत्याशित रूप से के रूप में अच्छी तरह से Magento की जड़ में एक नियमित रूप से नजरअंदाज कर दिया जाएगा? यह एक थोड़ा सा सवाल है क्योंकि यह वास्तव में पहले से ही मेरे साथ हुआ था, जो बग को खोजने के लिए वास्तव में कठिन था।

तो, Magento में .gitignoreफ़ाइल (जो मैं एक उदाहरण के रूप केवल की चर्चा करते हुए कर रहा हूँ, Btw) तो वे सही ढंग से जड़ से शुरू pathnames के खिलाफ मिलान किया जाता है पैटर्न के एक बहुत, स्लैश होते हैं, लेकिन कुछ मामलों में, जैसे देखते हैं downloader/या errors/कि , अगर मैं गलत नहीं हूं, तो संभावित रूप से खतरनाक हैं, और जिसे संभवतः बदल दिया जाना चाहिए /downloader/और /errors/

एक अधिक सामान्य प्रश्न के रूप में, क्या मुझे हमेशा स्लैश वाले पैटर्न के लिए अग्रणी स्लैश का उपयोग करना चाहिए, जिसमें स्लैश (एक अनुगामी को छोड़कर) नहीं है, जब मैं स्पष्ट रूप से रूट से शुरू होने वाले पथनाम का चयन करना चाहता हूं, और स्लैश वाले पैटर्न के लिए इसका उपयोग नहीं करना चाहिए, या मुझे करना चाहिए हमेशा स्पष्टता के लिए अग्रणी स्लैश का उपयोग करें? आपने इस बारे में क्या सोचा?

पढ़ने के लिए धन्यवाद और लंबी पोस्ट के लिए खेद है।


8
महान प्रश्न और वास्तव में अच्छी व्याख्या, मैं भी इससे परेशान था और आपके शोध ने मुझे स्पष्ट कर दिया। इसे पढ़ने के बाद मैं कहूंगा कि हमेशा स्लैश के साथ रास्ते शुरू करना अच्छा है यदि उन्हें रूट से शुरू करना चाहिए, तो यह इरादे को और अधिक स्पष्ट करता है।
मार्टिंसोस

4
धन्यवाद :) मैं इरादा स्पष्ट करने के लिए स्लैश का उपयोग करने के बारे में आपके नोट से सहमत हूं।
स्वाहिनी

8
यह .gitignore प्रलेखन का हिस्सा होना चाहिए। समझने में बहुत आसान है!
रमरिन

मैं इस महान पोस्ट को प्रश्न और उत्तर अनुभागों में
तोड़कर देखना पसंद करूंगा

जवाबों:


25

बस संभव त्वरित भविष्य के संदर्भ के लिए संक्षेप में प्रस्तुत करना चाहता था - प्रमुख स्लैश ने मैच को जड़ तक लंगर डाला। इस प्रकार, नीचे दिए गए उदाहरण में, स्लैश के बिना, वाइल्डकार्ड भी फू के भीतर सब कुछ को बाहर कर देगा क्योंकि यह *पेड़ के नीचे पुनरावर्ती रूप से ले जाएगा और ले जाएगा। हालाँकि, /*यह फ़ोल्डर फू और उसकी सामग्री को छोड़कर सब कुछ को शामिल करता है:

$ cat .gitignore
/*
!/foo

24

आपने अपने प्रश्न का पूरी तरह से उत्तर दिया है। यदि आप github / gitignore रेपो को अधिक बारीकी से देखते हैं, तो आप देखेंगे कि अधिकांश फाइलें असंगत नियमों का उपयोग करती हैं कि पैटर्न कैसे लिखे जाते हैं; यह बहुत संभव है कि उन लोगों द्वारा सबसे अधिक योगदान दिया गया था जो प्रलेखन को पढ़ने के लिए परेशान नहीं करते थे और न ही चीजों का परीक्षण करते थे जैसा आपने किया था।

तो अगर यह मदद करता है: आप सही हैं, आश्वस्त रहें।

यदि आप इस तरह की सहयोगी परियोजनाओं में गलतियाँ देखते हैं, तो अपने ज्ञान का योगदान करने में संकोच न करें। अगर आपको अपने आत्मविश्वास को और अधिक बढ़ाने की आवश्यकता है, तो कुछ मिसालें भी हैं ।

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