2009-07-06 6 views
16

मेरे पास निम्न संरचना वाला एक प्रोजेक्ट है:गिट: मैं उप निर्देशिका में मिलान निर्देशिकाओं को कैसे नजरअंदाज करूं?

/. 
    /src 
    /project1 
     /bin 
     /obj 
    /project2 
     /bin 
     /obj 
    /tools 
    /tool1 
     /bin 

मैं "src" के अंतर्गत सभी bin/obj निर्देशिकाओं को अनदेखा करने के लिए अपने .git/info/को बहिष्कृत करने के लिए क्या जोड़ सकता हूं? मैं स्पष्ट रूप से प्रत्येक प्रोजेक्ट नाम निर्दिष्ट नहीं करना चाहता हूं।

उत्तर

19

अपने .gitignore फ़ाइल में ये पंक्तियां जोड़ने का प्रयास करें:

src/*/bin 
src/*/obj 
+0

यह सिर्फ काम करता है ... धन्यवाद :) –

+0

'1.7.0.2.msysgit.0' साथ मेरे लिए काम नहीं करता है। मैंने एक उत्तर पोस्ट किया जो मेरे लिए काम करता है। –

+0

@Drew: आपका उत्तर अधिक काम के बाद से यह कम उपद्रव के साथ सभी निर्देशिकाओं से मेल खाता है लगता है, इसलिए मैं इसे मतदान अप। कहा कि, मैं क्यों इस सवाल का जवाब आपके लिए काम नहीं है, क्योंकि मैं इस मुद्दे के बिना इस तकनीक का उपयोग कर रहा वर्तमान में पता नहीं है। शायद गिट का आपका संस्करण पुराना है? –

1

मेरा मानना ​​है कि आप

src/*/bin/* 

.gitignore में जोड़ने के लिए सक्षम होना चाहिए, और कुछ भी है कि नमूने का मिलान नजरअंदाज कर दिया जाएगा।

+1

'1.7.0.2.msysgit.0' के साथ मेरे लिए काम नहीं करता है। –

8

सबसे स्पष्ट रास्ता src/.gitignore में जोड़ने का होगा:

obj/ 
bin/ 

यह किसी भी पथ है कि एक में हैं पर ध्यान नहीं देता निर्देशिका कॉल obj, या निर्देशिका निर्देशिका से नीचे bin नामक निर्देशिका। यदि आप आगे पेड़ नीचे कुछ obj और bin निर्देशिका के साथ एक दांतेदार परियोजना पदानुक्रम है

कुछ एक शीर्ष स्तर .gitignore में src/*/obj/ की तरह काम न करे।

#!/bin/sh 
mkdir src 
mkdir tools 

mkdir src/project1 
mkdir src/project2 
mkdir tools/tool1 

mkdir src/project1/bin 
mkdir src/project1/obj 
mkdir src/project2/bin 
mkdir src/project2/obj 
mkdir tools/tool1/bin 

touch testfile 
touch src/testfile 
touch tools/testfile 
touch src/project1/testfile 
touch src/project2/testfile 
touch tools/tool1/testfile 
touch src/project1/bin/testfile 
touch src/project1/obj/testfile 
touch src/project2/bin/testfile 
touch src/project2/obj/testfile 
touch tools/tool1/bin/testfile 

git init 

add_empty() { touch "$1" && git add "$1"; } 

add_empty dummy 
add_empty src/dummy 
add_empty tools/dummy 
add_empty src/project1/dummy 
add_empty src/project2/dummy 
add_empty tools/tool1/dummy 

git status 

printf 'obj/\nbin/\n' >src/.gitignore && git add src/.gitignore 

git status 

पहले स्थिति का ट्रैक न किए गए फ़ाइल अनुभाग है:

यहाँ त्वरित परीक्षण खोल कार्रवाई में उपेक्षा नियम दिखा स्क्रिप्ट है

# Untracked files: 
# (use "git add <file>..." to include in what will be committed) 
# 
#  src/project1/bin/ 
#  src/project1/obj/ 
#  src/project1/testfile 
#  src/project2/bin/ 
#  src/project2/obj/ 
#  src/project2/testfile 
#  src/testfile 
#  testfile 
#  tools/testfile 
#  tools/tool1/bin/ 
#  tools/tool1/testfile 

और .gitignore फ़ाइल जोड़ने के बाद:

# Untracked files: 
# (use "git add <file>..." to include in what will be committed) 
# 
#  src/project1/testfile 
#  src/project2/testfile 
#  src/testfile 
#  testfile 
#  tools/testfile 
#  tools/tool1/bin/ 
#  tools/tool1/testfile 

यह साबित करने के लिए एक परीक्षण के रूप में कि गिटनामक फ़ाइलों को अनदेखा नहीं कर रहा है 973,210 और bin लेकिन इस स्क्रिप्ट चलाने के बाद आगे obj और bin निर्देशिका अनदेखी कर रहा है पदानुक्रम नीचे:

#!/bin/sh 
mkdir src/project3 
touch src/project3/testfile && git add src/project3/testfile 
touch src/project3/obj 
touch src/project3/bin 

mkdir src/subdir 
mkdir src/subdir/proj 
touch src/subdir/proj/testfile && git add src/subdir/proj/testfile 
mkdir src/subdir/proj/obj 
mkdir src/subdir/proj/bin 
touch src/subdir/proj/obj/testfile 
touch src/subdir/proj/bin/testfile 

नया ट्रैक न किए गए फ़ाइलें हैं:

# Untracked files: 
# (use "git add <file>..." to include in what will be committed) 
# 
#  src/project1/testfile 
#  src/project2/testfile 
#  src/project3/bin 
#  src/project3/obj 
#  src/testfile 
#  testfile 
#  tools/testfile 
#  tools/tool1/bin/ 
#  tools/tool1/testfile 
+0

मुझे यकीन नहीं है कि यह सभी गहराई के लिए काम करेगा। मैं उन पैटर्न यहाँ समस्या आई: http://stackoverflow.com/questions/991801/git-ignores-and-maven-targets/991873#991873 (और यह भी है कि इसका जवाब की टिप्पणी में लिंक की जाँच करें) – VonC

+0

ऐसा नहीं हैं नहीं, यह एक बग है। स्लैश का अर्थ है 'केवल एक निर्देशिका के रूप में मैच', के बाद कि यह तो बस एक नियमित रूप से फ़ाइल ग्लोब के रूप में (स्लैश निकाल दिया जाता है) एक स्लेश के बिना एक पैटर्न के रूप में इलाज है, और कहीं भी मेल खाएगी। मुझे यकीन नहीं है कि '**' चीज़ कहां से आती है क्योंकि यह एक वाक्यविन्यास नहीं है जो गिट का समर्थन करता है। –

+0

अनुपूरक, यदि आपको वर्तमान निर्देशिका से मिलान को एंकर करने की इच्छा नहीं है, तो आपको विशेष रूप से एक * अग्रणी * स्लैश की आवश्यकता है, लेकिन यह मामला यहां नहीं है, हम इसे निर्देशिका में कहीं भी चाहते हैं, न कि किसी निर्देशिका में 'एंकर'। –

16

स्वीकार किए जाते हैं जवाब मेरे लिए काम नहीं किया।

> git --version 
git version 1.7.0.2.msysgit.0 

लगता है कि फ़ॉरवर्ड स्लैश .gitignore फ़ाइल में msysgit साथ काम नहीं करते। यह काम।

*\bin 
*\obj 

हालांकि जो, एक समस्या है जब यह है के अलावा संभावना नहीं है किसी भी फाइल भी bin या obj कहा जाता है, को बाहर से मेल कर सकते हैं।निम्नलिखित इस के आसपास हो जाता है (और हाँ, फॉरवर्ड स्लैश इस मामले में काम करता है):

bin/ 
obj/ 
*.user 
*.suo 

यह जिसमें .gitignore फ़ाइल रखा गया है फ़ोल्डर के अन्तर्गत पदानुक्रम में विभिन्न गहराई में फ़ाइलों का मिलान। ध्यान दें कि उपर्युक्त काम नहीं करता था जब मैंने एक विशिष्ट उपफोल्डर के लिए उपसर्ग शामिल किया था, इसलिए मैंने इसे अपने Source फ़ोल्डर में सीधे रखा।

एक विजुअल स्टूडियो उपयोगकर्ता के रूप में (संभवतः ओपी बिन/ओबीजे संदर्भ से भी है) .user और .suo फ़ाइलों को बाहर करना भी अच्छा है।


gitignore specification से:

पैटर्न निम्न स्वरूप है:

  • एक खाली लाइन के लिए कोई फ़ाइल से मेल खाता है, तो यह पठनीयता के लिए एक विभाजक के रूप में सेवा कर सकते हैं।

  • # से शुरू होने वाली एक पंक्ति एक टिप्पणी के रूप में कार्य करती है।

  • एक वैकल्पिक उपसर्ग! जो पैटर्न को अस्वीकार करता है; पिछले पैटर्न द्वारा छोड़ा गया कोई मिलान फ़ाइल फिर से शामिल हो जाएगी। यदि एक नकारात्मक पैटर्न मिलान करता है, तो यह निम्न प्राथमिकता पैटर्न स्रोतों को ओवरराइड करेगा।

  • यदि पैटर्न स्लैश के साथ समाप्त होता है, तो इसे निम्न विवरण के उद्देश्य से हटा दिया जाता है, लेकिन यह केवल निर्देशिका के साथ एक मिलान प्राप्त करेगा। दूसरे शब्दों में, foo/इसके नीचे एक निर्देशिका foo और पथ से मेल खाएगा, लेकिन नियमित फ़ाइल या प्रतीकात्मक लिंक foo से मेल नहीं खाएगा (यह इस तरह से संगत है कि पथ पथ सामान्य रूप से गिट में कैसे काम करता है)।

  • यदि पैटर्न में स्लैश नहीं होता है, तो गिट इसे शैल ग्लोब पैटर्न के रूप में मानता है और .gitignore फ़ाइल के स्थान के सापेक्ष पथनाम के खिलाफ एक मैच के लिए जांच करता है (कार्य पेड़ के अपूर्ण के सापेक्ष यदि एक .gitignore फ़ाइल से नहीं)।

  • अन्यथा, गिट एफएनएम_PATHNAME ध्वज के साथ fnmatch (3) द्वारा उपभोग के लिए उपयुक्त शेल ग्लोब के रूप में पैटर्न का व्यवहार करता है: पैटर्न में वाइल्डकार्ड पथनाम में/से मेल नहीं खाते हैं। उदाहरण के लिए, "दस्तावेज़ीकरण/*। एचटीएमएल" मिलान "दस्तावेज़ीकरण/git.html" लेकिन "दस्तावेज़ीकरण/पीपीसी/पीपीसीएचटीएमएल" या "उपकरण/perf/दस्तावेज़ीकरण/perf.html" नहीं।

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

+0

आप नायक हैं !! – asgerhallas

+0

bin/ obj/ * .user * .suo पूरी तरह से काम किया है .. धन्यवाद – kpasgma

+0

बिन/obj/* .user * .suo आप क्या चाहते हैं, अगर Git एक्सटेंशन का पूर्वावलोकन नहीं है चिंता मत करो बस इसे जोड़ा जाता है अपने शीर्ष स्तर पर .gitignore किसी भी तरह :) –

2

मेरे लिए भ्रम था कि एक बार उन्होंने कहा, जो कुछ भी मुखौटा आप उस पर डाल दिया, फ़ाइलें भंडार रहेगा जब तक कि जबरन हटा दिया तो एक कच्चे, संकलित दृश्य स्टूडियो समाधान जोड़ा, मैं करने के लिए किया था भंडार जारी करने से साफ:

git rm --cached */obj/* 
git rm --cached */lib/* 
git rm --cached *.user 
git rm --cached *.suo 
git rm --cached *ReSharper 

तो, इस .gitignore को जोड़ा गया:

*/*/bin 
*/*/obj 
*.user 
*.suo 
*ReSharper* 

तो प्रतिबद्ध:

git add . 
git commit -m "removed user files and binaries from repository" 
संबंधित मुद्दे