Git में उपेक्षित निर्देशिकाओं की उपनिर्देशिकाएँ


100

मान लीजिए कि मैंने किसी निर्देशिका को अनदेखा कर दिया है, लेकिन मैं विशिष्ट उपनिर्देशिकाओं को उसमें निर्दिष्ट करना चाहता हूं। इसलिए मेरे पास सेटअप है:

/uploads/
/uploads/rubbish/
/uploads/rubbish/stuff/KEEP_ME/
/uploads/foo/
/uploads/foo/bar/lose/

और मैं सब कुछ को अनदेखा करना चाहता हूं लेकिन KEEP_MEनिर्देशिका। मुझे उम्मीद है कि अनदेखी कुछ इस तरह दिखाई देगी:

/uploads/*
!/uploads/rubbish/stuff/KEEP_ME/

लेकिन यह काम नहीं कर रहा है, और न ही एक ही विषय पर कई क्रमपरिवर्तन हैं।

जो काम करता है वह है

/uploads/**/**/**/
!/uploads/rubbish/stuff/KEEP_ME/

लेकिन यह थोड़ा प्रतिबंधात्मक और क्रियात्मक लगता है?


1
आपके द्वारा प्रदान किया गया कोड मेरे लिए काम नहीं करता था (git संस्करण 1.9.1 का उपयोग करके)। जो काम किया है, वह है / अपलोड / *! / अपलोड / बकवास / / अपलोड / बकवास / * / अपलोड / बकवास / सामान / अपलोड / बकवास / सामान / *! / अपलोड / बकवास / सामान / रखना (जो उदाहरण के समान है) in git-scm.com/docs/gitignore )। मेरा फ़ोल्डर संरचना; └ README.md └ अपलोड / foo / बार / खो / lose.txt └ अपलोड / बकवास / सामान / / keep.txt रखने
gihanchanuka

जवाबों:


119

Gitignore प्रलेखन के पैटर्न प्रारूप अनुभाग के अनुसार :

एक वैकल्पिक उपसर्ग ""! जो पैटर्न को नकारता है; पिछले पैटर्न द्वारा बाहर की गई कोई भी मिलान फ़ाइल फिर से शामिल हो जाएगी। किसी फ़ाइल को फिर से शामिल करना संभव नहीं है यदि उस फ़ाइल की मूल निर्देशिका को बाहर रखा गया है। Git प्रदर्शन कारणों के लिए बहिष्कृत निर्देशिका को सूचीबद्ध नहीं करता है, इसलिए निहित फ़ाइलों पर किसी भी पैटर्न का कोई प्रभाव नहीं पड़ता है, कोई फर्क नहीं पड़ता कि वे कहाँ परिभाषित हैं। पहले के सामने एक बैकस्लैश ("\") रखो! " पैटर्न के लिए जो एक शाब्दिक के साथ शुरू होता है "!", उदाहरण के लिए, "! महत्वपूर्ण! .txt"।

इसलिए पहले से बहिष्कृत मूल निर्देशिका /uploads/rubbish/stuff/keep/पैटर्न को इसकी सामग्री को नकारने से पहले विशेष रूप से नकार दिया जाना चाहिए:

#ignore everything within /uploads/ 
/uploads/*

#include everything within /uploads/rubbish/stuff/keep
!/uploads/rubbish/stuff/keep/  
!/uploads/rubbish/stuff/keep/*

/uploads/rubbish/stuff/keep/तीसरी पंक्ति जोड़ने के अंदर उपनिर्देशिका शामिल करने के लिए :

!/uploads/rubbish/stuff/keep/**/*

1
आप किस संस्करण का उपयोग कर रहे थे? शायद यह केवल कुछ संस्करणों में उपलब्ध कुछ है।

शर्मिंदा। मैं भूल गया कि मैंने यह टिप्पणी पोस्ट की है। मैं इसे काम कर रहा था, हालांकि। FWIW, मैं अग्रणी स्लैश का उपयोग नहीं करता हूं। मुझे याद नहीं है कि अगर यह मुद्दा था। मैं 1.7.2.5 का उपयोग कर रहा हूं।

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

मैंने फ़ोल्डर को छोड़कर और उप-फ़ोल्डर को शामिल करते हुए दिए गए फ़ोल्डर से पहले और बाद दोनों में स्पष्ट रूप से मनमानी निर्देशिकाओं को निर्दिष्ट करना आवश्यक पाया । ( पूर्ण उत्तर )।
जोशिया योदर

यह विधि काम नहीं करती है (git 2.25 के रूप में - शायद गिट में कुछ बदल गया है)। मैंने एक सुधार के रूप में stackoverflow.com/a/60288435/295691 नीचे पोस्ट किया है ।
user295691

34

यहां तक ​​कि अगर आप कुछ जोड़ते हैं .gitignore, तो आप इसे सूचकांक में जोड़ने के लिए बाध्य कर सकते हैं

git add --force uploads/rubbish/stuff/KEEP_ME/

हालाँकि, "KEEP_ME" को एक निर्देशिका लगता है और git आमतौर पर खाली फ़ोल्डर की तरह नहीं होता है, इसलिए आपको इसके बजाय "प्लेसहोल्डर" -होल्डर फ़ाइल जोड़ना चाहिए, यदि फ़ोल्डर खाली है

git add --force uploads/rubbish/stuff/KEEP_ME/.keep_me

इसके साथ एकमात्र मुद्दा यह है कि यह विशिष्ट उदाहरण एक वैश्विक gitignore को संदर्भित करता है जिसका मुझे उल्लेख करना चाहिए था। मुझे पता है कि मैं आइटम जोड़ने के लिए बाध्य कर सकता हूं, लेकिन मुझे यह करना होगा कि यदि कोई नया आइटम जोड़ा जाता है, साथ ही साथ प्रत्येक नए रिपॉजिटरी के लिए भी। क्या। प्रशासन सुनिश्चित करता है कि सामग्री की अनदेखी न की जाए?
Wil

1
थोड़ा परीक्षण किया। हां, आपको git add --forceहर नए आइटम या फ़ोल्डर के लिए उपयोग करना होगा KEEP_ME। लेकिन उसके बाद, अपडेट्स बस जोड़ दिए जाते हैं ( git add -uउदाहरण के लिए) जब फाइलें 'बिना बही' की होती हैं। .keep_meताकि Git फ़ोल्डर पर चल रही है कुछ भी नहीं है, इसकी सिर्फ एक फ़ाइल है।
आम डाक

1
git add --forceइसके लिए गलत समाधान है। यदि आप एक निर्देशिका को स्थानांतरित करते हैं या फ़ाइल को किसी अन्य निर्देशिका में ले जाते हैं, तो गिट की ट्रैकिंग फ़ाइल को हटा देगी लेकिन इसे नए स्थान पर नहीं जोड़ेगी और आपको git add --forceफिर से करना होगा । जेनेरिक पैटर्न पर हस्ताक्षर करके, git रेपो के भीतर एक फ़ाइल की गति को ट्रैक करेगा।
मर्लिन

यह एकमात्र समाधान है जिसने मेरे लिए काम किया। मेरे फ़ोल्डर को अनदेखा नहीं किया गया था, लेकिन मैं इसे किसी भी तरह से जोड़ नहीं सका। इस तरह यह मेरे लिए हल हो गया।
अकिटो

6

यह जानने की कोशिश कर रहा था कि जेनेरिक अपवर्जन के साथ सभी फ़ोल्डरों को छोड़कर एक विशिष्ट फ़ोल्डर को कैसे शामिल किया जाए

**/build

यदि आप /*अपने जेनेरिक के अंत को जोड़ते हैं, तो आप सभी बिल्ड फ़ाइलों को बाहर करना जारी रखते हैं**/build/*

फिर आप उस पथ के लिए सही करने के लिए एक और पंक्ति जोड़ते हैं जिसे आप देखना चाहते हैं

!**/folder/build/* 

हमें एक gitignore छोड़कर जो पढ़ता है

**/build/* 
!**/folder/build/* 

2

बू-रेन लिन और जॉन के जवाब काफी मददगार हैं, लेकिन मुझे दोनों को मिलाने की जरूरत है।

जब अपलोड के भीतर अन्य उप-फ़ोल्डरों के साथ-साथ फाइलों को बाहर करना चाहते हैं, तो मैंने फ़ोल्डर को बाहर करते समय और उप-फ़ोल्डर को शामिल करते हुए दिए गए फ़ोल्डर से पहले स्पष्ट रूप से मनमानी निर्देशिकाओं को निर्दिष्ट करना आवश्यक पाया।

**/uploads/*
!**/uploads/rubbish/
!**/uploads/rubbish/*

मुझे उप-फ़ोल्डर और उसकी सामग्री दोनों को फ़ोल्डर और उप-फ़ोल्डर्स के भीतर दिखाने के लिए दोनों सामग्रियों को स्पष्ट रूप से फिर से शामिल करना भी आवश्यक लगा।


आह। यहां जीरो लक। इस पर अब घंटों के लिए। Git 2.20.1
रिचीएच

@ HörmannHH सुनने के लिए क्षमा करें। शायद यह एक नया सवाल पूछने का समय है?
योशिय्याह योद

2

सबसे उत्तोलित उत्तर के रूप में प्रस्तुत समाधान गलत है, और आसानी से इस तरह के प्रदर्शन के रूप में।

अपलोड / * में सब कुछ अनदेखा करने के साथ शुरू करें:

mkdir -p uploads/rubbish/stuff/KEEP_ME
touch uploads/a uploads/rubbish/a uploads/rubbish/stuff/a uploads/rubbish/stuff/KEEP_ME/a
echo '/uploads/*' >> .gitignore
git init
git add .
git commit -m "Initial commit"

अब उपर्युक्त उपेक्षित सामग्री की मूल निर्देशिका को असाइन करें:

echo 'uploads/rubbish/stuff/KEEP_ME/' >> .gitignore
echo 'uploads/rubbish/stuff/KEEP_ME/*' >> .gitignore
git status -u

कोई भी फ़ाइल नहीं दिखाई गई।

इसे काम पर लाने के लिए, आपको uploads/पेड़ के नीचे सभी फ़ाइलों को अनदेखा करने की आवश्यकता है ( uploads/**/*न केवल शीर्ष स्तर uploads/*) , और फिर उस पेड़ की सभी मूल निर्देशिकाओं को जोड़ें जिन्हें आप रखना चाहते हैं

echo '/uploads/**/*' > .gitignore
echo '!/uploads/rubbish/' >> .gitignore
echo '!/uploads/rubbish/stuff' >> .gitignore
echo '!/uploads/rubbish/stuff/KEEP_ME' >> .gitignore
echo '!/uploads/rubbish/stuff/KEEP_ME/*' >> .gitignore
git status -u

जो देता है:

On branch master
...
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        uploads/rubbish/stuff/KEEP_ME/a

यदि हमने उपरोक्त uploads/*में उपयोग किया था .gitignore, तो सभी मध्यवर्ती फ़ाइलों को भी शामिल किया गया होगा, इसलिए उदाहरण के लिए uploads/rubbish/aऊपर की स्थिति में दिखाया जाएगा।

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