गीट में श्वेतसूची और उपनिर्देशिकाएँ


91

मैंने केवल पाठ फ़ाइलों के लिए एक श्वेत सूची बनाई है।

*
!*.txt

अब, मेरे पास एक उप-निर्देशिका में एक अनट्रैकेड टेक्स्ट फ़ाइल है - sub/dir/file.txtऔर यह नहीं दिखाया गया है (इसे अनदेखा किया गया है)। हालांकि रूट डायरेक्टरी में टेक्स्ट फाइलें दिखाई जाती हैं।

ऐसा क्यों है, और मैं इसे कैसे ठीक करूं?


1
संबंधित: stackoverflow.com/q/987142/78845
Johnsyweb

क्या वे फाइलें जिन्हें आप एक उप-निर्देशिका में शामिल करना चाहते हैं? यदि हां, तो इस उप निर्देशिका को पहले से ही आपके पहले स्टार द्वारा अनदेखा किया जा सकता है .gitignore
फजरन

हाँ। ये फ़ाइलें निर्देशिका संरचना में मेरे उदाहरण में 11.1.102.55 फ़ोल्डर जितनी कम होंगी। नेस्टिंग हमेशा फ़ोल्डर्स / उत्पादों के बीच समान नहीं होती है।
नट

1
मुझे इस कार्यक्षमता का पता है। हमारे पास सैकड़ों निर्देशिकाएं हैं। यह केवल उन स्पष्टताओं को अनदेखा करने के लिए तेज़ होगा, जिन्हें हम प्रत्येक निर्देशिका के लिए एक gignignore बनाने से नहीं चाहते हैं। मैं वास्तव में .gitignore फ़ाइल से श्वेतसूची कार्यक्षमता प्राप्त करने का एक तरीका ढूंढ रहा हूं।
रात्रि

1
मैं नहीं देखता कि यह एक डुप्लिकेट कैसे है। दूसरा सवाल यह है कि कुछ फाइलों को कैसे श्वेतसूची में रखा जाए, जबकि यह पूछता है कि कुछ फाइल प्रकारों को श्वेतसूची में कैसे शामिल किया जाए। दरअसल, यह स्टैकओवरफ्लो का एक डुप्लिकेट की तरह है ।questions/ 8024924/…
बिग मैकलारेग्यूज

जवाबों:


146

यदि आप इसे इस तरह आज़माते हैं, तो यह विफल हो जाएगा, क्योंकि आप अपनी संरचना में निर्देशिकाओं को ब्लैकलिस्ट कर देंगे।

हल करने के लिए, आप उन सभी चीज़ों को ब्लैकलिस्ट करना चाहते हैं जो एक निर्देशिका नहीं है, और उन फ़ाइल-प्रकारों में से एक नहीं है जिन्हें आप कमिट करना चाहते हैं, जबकि निर्देशिकाओं को ब्लैकलिस्ट करना नहीं है

ऐसा करने वाली .gitignoreफ़ाइल:

# First, ignore everything
*
# Now, whitelist anything that's a directory
!*/
# And all the file types you're interested in.
!*.one
!*.two
!*.etc

इसकी तीन स्तरीय संरचना में परीक्षण .txtकिया गया, उपस्थिति की फाइलों के लिए श्वेत-सूचीकरण *.one, *.twoऔर रिपॉजिटरी की रूट डायरेक्टरी में स्थित *.threeफाइलों का उपयोग करना .gitignore- मेरे लिए काम करता है। आपको .gitignoreअपनी संरचना में सभी निर्देशिकाओं में फ़ाइलों को नहीं जोड़ना होगा ।

मुझे इस बात का जवाब देने के लिए इस्तेमाल की गई जानकारी, अन्य बातों के अलावा, इस (stackoverflow.com) से मिली ।


18
!.gitignoreउपयोग *करते समय आपको प्रवेश की भी आवश्यकता होती है , है ना?
sjas

2
मेरा जवाब यहां देखें: stackoverflow.com/questions/987142/… यह /*शीर्ष स्तर के फ़ोल्डर में सिर्फ ब्लैकलिस्ट करने के लिए उपयोग करने के लिए और अधिक उपयोगी हो सकता है , लेकिन सभी फ़ोल्डर्स पुनरावर्ती रूप से नहीं, जिसका वास्तव में मतलब है कि .gitignoreएक श्वेत सूची वाले फ़ोल्डर के सबफ़ोल्डर में नहीं देखना चाहिए।
रयान टेलर

1

इसे प्राप्त करने का एक सरल तरीका है:

# Blacklist all files...
*.*

# ...except the ones we want
!*.txt

यह काम करता है क्योंकि gitignoreपैटर्न लागू होता है /जो .gitignoreफ़ाइल के नीचे हर स्तर से शुरू नहीं होता है :

यदि पैटर्न की शुरुआत या मध्य (या दोनों) में एक विभाजक है, तो पैटर्न विशेष रूप से .gitignore फ़ाइल की निर्देशिका के सापेक्ष है। अन्यथा पैटर्न .ignignore स्तर से नीचे के किसी भी स्तर से मेल खा सकता है।

यदि आप निर्देशिका के अंदर फ़ाइलों के लिए ऐसा करना चाहते हैं , तो चीजें अधिक जटिल हो जाती हैं:

# Blacklist all files in all directories inside subdir...
/subdir/**/*.*

# ...except the ones we want
!/subdir/**/*.txt

यह काम करता है क्योंकि gitignoreइसके लिए विशेष नियम हैं **:

**पूर्ण पथनाम के विरुद्ध मिलान किए गए पैटर्न में दो लगातार तारांकन (" ") का विशेष अर्थ हो सकता है:

  • एक स्लैश के बाद लगातार दो तारांकन फिर एक स्लैश शून्य या अधिक निर्देशिकाओं से मेल खाता है। उदाहरण के लिए, " a/**/b" मैच " a/b", " a/x/b", " a/x/y/b" और इसी तरह।

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


0

मैंने लंबे समय तक खोज की:

  1. मान लें कि मेरे पास एक बड़ी फ़ोल्डर संरचना है ~ 100.000 निर्देशिकाएं पुनरावर्ती रूप से नेस्टेड हैं। उन फ़ोल्डरों में, टाइप की लगभग 30.000 फाइलें हैं .txt(मेरे मामले में: टाइप *.md)। इन *.mdफ़ाइलों के आगे, आप कहते हैं, 500GB (एक मिलियन +) फ़ाइलें जिन्हें मैं ट्रैक नहीं करना चाहता हूं।

  2. मैं सभी फ़ोल्डरों और उपखंडों में केवल .txt(या *.md) फाइलों को ट्रैक करना चाहता हूं ।

सही उत्तर होना चाहिए: Git में यह संभव नहीं है।

इसके बजाय मैंने क्या किया:

[संपादित करें: यह भी काम नहीं किया - मैंने सिम्बलिंक (या हार्डलिंक) के साथ एक फ़ोल्डर बनाने की कोशिश की और वहां गिट का उपयोग किया, लेकिन गिट सीम्लिंक का पालन नहीं करता है और हार्डलिंक को अधिलेखित करता है। रवींद्र!]

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