.gitignore फ़ोल्डर को बाहर करें लेकिन विशिष्ट सबफ़ोल्डर शामिल करें


963

मेरे पास फ़ोल्डर है application/जिसे मैं इसमें जोड़ता हूं .gitignoreapplication/फ़ोल्डर के अंदर फ़ोल्डर है application/language/gr। मैं इस फ़ोल्डर को कैसे शामिल कर सकता हूं?

मैंने यह कोशिश की है

application/
!application/language/gr/

भाग्य नहीं ...


1
उम्मीद है, " .gitignoreपैटर्न प्रारूप" प्रलेखन अभी स्पष्ट हो गया (दिसंबर 2013)। देखें नीचे मेरा उत्तर
VonC

मेरा पसंदीदा प्रश्न और उत्तर, पसंदीदा के साथ-साथ ब्राउज़र बुकमार्क में भी जोड़ा गया।
कोडकिडी

जवाबों:


1610

यदि आप बाहर करते हैं application/, तो इसके तहत सब कुछ हमेशा बाहर रखा जाएगा (भले ही कुछ बाद के नकारात्मक बहिष्करण पैटर्न ("अनइग्नोर") के तहत कुछ मिलान कर सकते हैं application/)।

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

# you can skip this first one if it is not already excluded by prior patterns
!application/

application/*
!application/language/

application/language/*
!application/language/gr/

नोट
अनुगामी /*महत्वपूर्ण है:

  • पैटर्न dir/नाम की एक निर्देशिका को शामिल करता है dirऔर (संक्षेप में) इसके तहत सब कुछ करता है।
    के साथ dir/, Git के तहत कुछ भी कभी नहीं दिखेगा dir, और इस प्रकार "un-बहिष्कृत" पैटर्न के तहत किसी भी चीज़ पर कभी भी लागू नहीं होगा dir
  • पैटर्न खुद के dir/*बारे में कुछ नहीं कहता dirहै; इसके अंतर्गत सब कुछ शामिल नहीं है dir। के साथ dir/*, Git dirअन्य सामग्री को संसाधित करेगा , जो अन्य पैटर्नों को कुछ सामग्री (" !dir/sub/) को" अन-बहिष्कृत "करने का मौका देगा ।

12
अनुगामी तारांकन महत्वपूर्ण हैं? यदि हां, तो अर्थ में अंतर क्या है? गितिग्नोर डॉक्यूमेंटेशन में वर्णित एल्गोरिथ्म के अनुसार , एक अनुगामी स्लैश के साथ समाप्त होना एक डायरेक्टरी और उस डायरेक्टरी के नीचे के रास्तों से मेल खाता है। एक तारांकन के साथ अंत में एक ग्लोब पैटर्न के रूप में इलाज के लिए गिर जाएगा। प्रयोग करना काम करने के लिए तारांकन संस्करण को दिखाता है, लेकिन सिर्फ एक अनुगामी स्लैश में समाप्त होने वाला नहीं। मैं समझना चाहता हूं कि ऐसा क्यों है।
seh

122
@ छे: हाँ, अनुगामी /*महत्वपूर्ण है। यदि किसी निर्देशिका को बाहर रखा जाता है, तो Git उस निर्देशिका की सामग्री को कभी नहीं देखेगा। पैटर्न dir/नाम की एक निर्देशिका को शामिल करता है dirऔर (संक्षेप में) इसके तहत सब कुछ करता है। पैटर्न खुद के dir/*बारे में कुछ नहीं कहता dirहै; इसके अंतर्गत सब कुछ शामिल नहीं है dir। के साथ dir/, Git के तहत कुछ भी कभी नहीं दिखेगा dir, और इस प्रकार "un-बहिष्कृत" पैटर्न के तहत किसी भी चीज़ पर कभी भी लागू नहीं होगा dir। के साथ dir/*, Git dirअन्य सामग्री को संसाधित करेगा , जो अन्य पैटर्नों को कुछ सामग्री (" !dir/sub/) को" अन-बहिष्कृत "करने का मौका देगा ।
क्रिस जॉन्सन

7
आह, यह बताते हैं। कोई फर्क नहीं पड़ता कि मैंने कितनी बार gitignore प्रलेखन पढ़ा है , मुझे कभी समझ नहीं आया कि उल्टे पैटर्न काम नहीं करते हैं। आपके स्पष्टीकरण के साथ, यह अब स्पष्ट है। यह कैसे करना है यह समझाने के लिए gitignore प्रलेखन को एक "नुस्खा" अनुभाग की आवश्यकता है।
सेह

8
मैं इसे काम करने के लिए काफी नहीं मिल सका (पागल। .ignignore फ़ाइल!), इसलिए इसके बजाय मैंने केवल उस निर्देशिका में cd'ing के बाद फ़ाइलों को जोड़ा जो मैंने चाहा था। git add -f .
K0D4

2
ध्यान दें कि आप के आउटपुट पर भरोसा नहीं कर सकते हैं git status, जो आपको बताएगा कि शीर्ष स्तर की निर्देशिका जोड़ी जा रही है। इसके बजाय, git addशीर्ष स्तर निर्देशिका का एक और फिर git status(उम्मीद है) पैटर्न द्वारा मेल की गई फ़ाइलों के सबसेट को सूचीबद्ध करेगा।
मैथ्यू स्ट्रॉब्रिज

136

Git 1.9 / 2.0 (Q1 2014) के लिए Karsten Blees (kblees) से 59856de कमिट करता है:

gitignore.txt: अपवर्जित निर्देशिकाओं की पुनरावर्ती प्रकृति को स्पष्ट करें

एक वैकल्पिक उपसर्ग " !" जो पैटर्न को नकारता है; पिछले पैटर्न द्वारा छोड़ी गई कोई भी मिलान फ़ाइल फिर से शामिल हो जाएगी।

यदि किसी फ़ाइल की मूल निर्देशिका को बाहर रखा गया है तो किसी फ़ाइल को फिर से शामिल करना संभव नहीं है। ( *)
(* : जब तक कुछ शर्तों को git 2.8+ में पूरा नहीं किया जाता है, नीचे देखें)
Git प्रदर्शन कारणों के लिए बहिष्कृत निर्देशिकाओं की सूची नहीं देता है, इसलिए निहित फ़ाइलों पर किसी भी पैटर्न का कोई प्रभाव नहीं पड़ता है, चाहे वे परिभाषित किए गए हों।

" \" !शाब्दिक के साथ शुरू होने वाले पैटर्न के लिए पहले " " के सामने एक बैकस्लैश डालें (" ")! " से , उदाहरण के लिए, " \!important!.txt"।

विशिष्ट निर्देशिका को छोड़कर सब कुछ बाहर करने के लिए उदाहरण foo/bar(ध्यान दें /*- स्लैश के बिना, वाइल्डकार्ड भी सब कुछ बाहर कर देगा foo/bar):

 --------------------------------------------------------------
     $ cat .gitignore
     # exclude everything except directory foo/bar
     /*
     !/foo
     /foo/*
     !/foo/bar
 --------------------------------------------------------------

आपके मामले में:

application/*
!application/**/
application/language/*
!application/language/**/
!application/language/gr/**

आपको श्वेत सूची देनी चाहिए किसी दिए गए फ़ोल्डर के भीतर सफेद-सूची फ़ाइलों को सक्षम करने से पहले, आपको पहले फ़ोल्डर को


अद्यतन फरवरी / मार्च 2016:

ध्यान दें कि git 2.9.x / 2.10 (2016 के मध्य में?) के साथ, एक फ़ाइल को फिर से शामिल करना संभव हो सकता है यदि पथ में कोई वाइल्डकार्ड फिर से शामिल न होने पर उस फ़ाइल की मूल निर्देशिका को बाहर कर दिया जाए

Nguyuyn Thái Ngọc Duy ( pclouds) इस सुविधा को जोड़ने का प्रयास कर रहा है:

तो git 2.9+ के साथ, यह वास्तव में काम कर सकता था, लेकिन अंत में वापस आ गया था:

application/
!application/language/gr/

मैंने खिड़कियों के लिए गिट पर आपके उत्तर के अंत में पोस्ट किए गए अपडेट किए गए सिंटैक्स का उपयोग करने की कोशिश की, v2.8.1.windows.1लेकिन यह काम नहीं करता है :(
डेविड हैनकॉक

1
@DavidHancock क्षमा करें, मैंने उत्तर संपादित किया है: यह अभी तक उपलब्ध नहीं है।
VonC

1
@DavidHancock मुझे भी: कि 13 से अधिक ढेर अतिप्रवाह जवाब है कि मुझे कई बार संपादित करना था!
VonC

5
Git 2.9 को कल जारी किया गया था। उत्तर में उल्लिखित application/+ !application/language/gr/पैटर्न की पुष्टि करना अपेक्षित रूप से काम कर रहा है।
रे शान

1
@ राशन स्ट्रेंज: मैंने उस सुविधा को रद्द करते हुए रिवर्ट कमिट देखा है, लेकिन मैंने नहीं देखा है (और रिलीज़ नोट github.com/git/git/blob/master/Documentation/RelNotes/2.9.0.tw उसका उल्लेख नहीं करता है) किसी भी तरह के सुधार।
वॉन

52

@ क्रिस जॉन्सन का उत्तर बहुत अच्छा है, लेकिन गिट (1.8.2 या बाद के) के नए संस्करणों के साथ, एक डबल तारांकन पैटर्न है जिसे आप थोड़ा और शॉर्टहैंड समाधान के लिए लाभ उठा सकते हैं:

# assuming the root folder you want to ignore is 'application'
application/**/*

# the subfolder(s) you want to track:
!application/language/gr/

इस तरह से आपको उस सबफ़ोल्डर की मूल निर्देशिका को "अनइग्नोर" नहीं करना होगा जिसे आप ट्रैक करना चाहते हैं।


Git 2.17.0 के साथ (यह निश्चित नहीं है कि इस संस्करण से पहले कितना जल्दी। संभवत: 1.8.2 पर वापस जाएं), **आपके फ़ाइल (एस) पर जाने वाले प्रत्येक उपनिर्देशिका के लिए शामिल किए गए पैटर्न का उपयोग करके काम करता है। उदाहरण के लिए:

# assuming the root folder you want to ignore is 'application'
application/**

# Explicitly track certain content nested in the 'application' folder:
!application/language/
!application/language/gr/
!application/language/gr/** # Example adding all files & folder in the 'gr' folder
!application/language/gr/SomeFile.txt # Example adding specific file in the 'gr' folder

9
काश, यह विफल हो जाता है (Git 1.8.4.msysgit.0) क्योंकि पैटर्न **शून्य सबफ़ोल्डर से मेल कर सकता है, और इसमें शामिल होने से रोकते हुए, इसे *मैच languageऔर बाहर कर देगा gr। माता-पिता @ क्रिस जॉनसन की पूरी श्रृंखला अभी भी आवश्यक लगती है।
सीन गुगलर

3
सही लगता है, लेकिन यह मेरे लिए काम पर नहीं है 2.3.7 git ... /www/**/* !/www/config.xml !/www/resconfig.xml और res निर्देशिका अभी भी नजरअंदाज कर रहे हैं।
रॉब

@ आप भी जोड़ने की जरूरत है !/www/res/। आप folder/**/*पैटर्न का उपयोग कर सकते हैं , लेकिन आपको अभी भी प्रत्येक उपनिर्देशिका के लिए अपवर्जन जोड़ना होगा जो आप चाहते हैं। यह अभी भी कम है और अनदेखा / बहिष्कृत कॉम्बो की तुलना में अधिक पठनीय है।
बेन केन

मुझे पता है कि यह एक पुरानी टिप्पणी है, लेकिन मामले में आप उत्सुक हैं। मैंने इस दृष्टिकोण के दस्तावेजीकरण के लिए एक संपादन जोड़ा है।
बेन केन

21

इस बारे में इसी तरह के सवालों का एक समूह है, इसलिए मैंने जो पहले लिखा था उसे पोस्ट करूंगा:

मेरी मशीन पर काम करने का एकमात्र तरीका मुझे यह करना था:

# Ignore all directories, and all sub-directories, and it's contents:
*/*

#Now ignore all files in the current directory 
#(This fails to ignore files without a ".", for example 
#'file.txt' works, but 
#'file' doesn't):
*.*

#Only Include these specific directories and subdirectories:
!wordpress/
!wordpress/*/
!wordpress/*/wp-content/
!wordpress/*/wp-content/themes/
!wordpress/*/wp-content/themes/*
!wordpress/*/wp-content/themes/*/*
!wordpress/*/wp-content/themes/*/*/*
!wordpress/*/wp-content/themes/*/*/*/*
!wordpress/*/wp-content/themes/*/*/*/*/*

ध्यान दें कि आपके द्वारा शामिल किए जाने वाले प्रत्येक स्तर के लिए आपको सामग्री को कैसे स्पष्ट रूप से अनुमति देना है। इसलिए अगर मेरे पास 5 उप-विषय हैं, तो मुझे अभी भी विषयों को समझने की जरूरत है।

यह @ यारिन की टिप्पणी से यहां है: https://stackoverflow.com/a/5250314/1696153

ये उपयोगी विषय थे:

मैंने भी कोशिश की

*
*/*
**/**

तथा **/wp-content/themes/**

या /wp-content/themes/**/*

उस में से किसी ने भी मेरे लिए काम नहीं किया। परीक्षण और त्रुटि के बहुत सारे!


1
नोट: याद रखें कि ऑर्डर एक .gitignore फ़ाइल में भी मायने रखता है, इसलिए सुनिश्चित करें कि आप अपने !नियमों को सबसे नीचे रखें।
स्टारबिम्रेनबोलाब्ज


8

सबसे सरल और संभवतया सबसे अच्छा तरीका फाइलों को मैन्युअल रूप से जोड़ने की कोशिश करना है (आम तौर पर यह पूर्व- .gitignoreओवरस्टाइल नियमों को लेता है ):

git add /path/to/module

तुम भी चाहते हो सकता है -N प्रयोजन जोड़ना झंडा, आप का सुझाव देना होगा उन्हें जोड़ने, लेकिन तुरंत नहीं। मैं अक्सर नई फ़ाइलों के लिए ऐसा करता हूं मैं अभी तक मंच के लिए तैयार नहीं हूं।


यह एक उत्तर की एक प्रति है जो आसानी से डुप्लिकेट क्यूए हो सकता है। बढ़ी हुई दृश्यता के लिए मैं इसे यहाँ पर दोहरा रहा हूँ - मुझे यह आसानी से पता चलता है कि मुझे gignignore के नियमों में कोई गड़बड़ नहीं है।


2
इस उत्तर के लिए धन्यवाद। मुझे जोड़ने के लिए -f था क्योंकि यह मेरे .gitignore में ऐसा है जैसे: git ऐड -f पथ / to / file
jasonflaherty

6

इसलिए, चूंकि कई प्रोग्रामर नोड का उपयोग करते हैं। उदाहरण के लिए node_modulesएक मॉड्यूल को छोड़कर, इस प्रश्न को पूरा करने वाला उपयोग मामला है module-a:

!node_modules/

node_modules/*
!node_modules/module-a/

2
गिट संस्करण के लिए काम नहीं करता है 2.10.2.windows.1
सेबस्टियन

1
Git संस्करण 2.10.2 के लिए इस उत्तर
nalexn

👋 महान 👋 👋।
अब्देनौर TOUMI

6

एक अतिरिक्त उत्तर जोड़ें:

!/.vs/              <== include this folder to source control, folder only, nothing else
/.vs/*              <== but ignore all files and sub-folder inside this folder
!/.vs/ProjectSettings.json <== but include this file to source control
!/.vs/config/       <== then include this folder to source control, folder only, nothing else
!/.vs/config/*      <== then include all files inside the folder

यहाँ परिणाम है:

यहां छवि विवरण दर्ज करें


2
यह मेरे लिए सबसे उपयोगी जवाब था क्योंकि विजुअल्स ने मदद की। धन्यवाद!
जोएल मर्फी

4

विशेष रूप से पुराने Git संस्करणों के लिए, अधिकांश सुझाव उस तरह से काम नहीं करेंगे। अगर ऐसा है, तो मैं एक अलग .gitignore को निर्देशिका में रखूंगा जहां मैं चाहता हूं कि सामग्री को अन्य सेटिंग्स की परवाह किए बिना शामिल किया जाए और जहां आवश्यक हो वहां अनुमति दें।

उदाहरण के लिए: /.itignoreore

# ignore all .dll files
*.dll

/dependency_files/.gitignore

# include everything
!*

तो / dependency_files (यहां तक ​​कि .dll फ़ाइलें) में सब कुछ ठीक शामिल हैं।


4

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

*
!public
!.gitignore

यदि आप ओपी परिदृश्य में चलते हैं तो यह पर्याप्त नहीं है।

यदि आप एक विशिष्ट सबफ़ोल्डर्स बनाना चाहते हैं public हैं, तो उदाहरण के लिए अपनी public/productsनिर्देशिका में आप उन फ़ाइलों को शामिल करना चाहते हैं जो एक सबफ़ोल्डर गहरी हैं जैसे कि public/products/a/b.jpgउन्हें शामिल करने के लिए सही तरीके से पता लगाया जाना चाहिए, भले ही आप उन्हें विशेष रूप से इस तरह से जोड़ दें!/public/products , !public/products/*, आदि ..

समाधान यह सुनिश्चित करने के लिए है कि आप उन सभी को ओवरराइड करने के लिए इस तरह से हर पथ स्तर के लिए एक प्रविष्टि जोड़ें।

*
!.gitignore
!public/
!public/*/
!public/products/
!public/products/*
!public/products/*/
!public/products/*/
!public/products/*/*

3

निर्देशिका संरचना के नीचे चलने का बस एक और उदाहरण है कि आप क्या चाहते हैं। नोट: मैंने बाहर नहीं किया Library/लेकिनLibrary/**/*

# .gitignore file
Library/**/*
!Library/Application Support/
!Library/Application Support/Sublime Text 3/
!Library/Application Support/Sublime Text 3/Packages/
!Library/Application Support/Sublime Text 3/Packages/User/
!Library/Application Support/Sublime Text 3/Packages/User/*macro
!Library/Application Support/Sublime Text 3/Packages/User/*snippet
!Library/Application Support/Sublime Text 3/Packages/User/*settings
!Library/Application Support/Sublime Text 3/Packages/User/*keymap
!Library/Application Support/Sublime Text 3/Packages/User/*theme
!Library/Application Support/Sublime Text 3/Packages/User/**/
!Library/Application Support/Sublime Text 3/Packages/User/**/*macro
!Library/Application Support/Sublime Text 3/Packages/User/**/*snippet
!Library/Application Support/Sublime Text 3/Packages/User/**/*settings
!Library/Application Support/Sublime Text 3/Packages/User/**/*keymap
!Library/Application Support/Sublime Text 3/Packages/User/**/*theme

> git add Library

> git status

On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   Library/Application Support/Sublime Text 3/Packages/User/Default (OSX).sublime-keymap
    new file:   Library/Application Support/Sublime Text 3/Packages/User/ElixirSublime.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/Package Control.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/Preferences.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/RESTer.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/SublimeLinter/Monokai (SL).tmTheme
    new file:   Library/Application Support/Sublime Text 3/Packages/User/TextPastryHistory.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/ZenTabs.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/adrian-comment.sublime-macro
    new file:   Library/Application Support/Sublime Text 3/Packages/User/json-pretty-generate.sublime-snippet
    new file:   Library/Application Support/Sublime Text 3/Packages/User/raise-exception.sublime-snippet
    new file:   Library/Application Support/Sublime Text 3/Packages/User/trailing_spaces.sublime-settings

वास्तव में मैं भी क्या करना चाहता था ;-)
कित्जे

3

वर्डप्रेस में, इससे मुझे मदद मिली:

wp-admin/
wp-includes/
/wp-content/*
!wp-content/plugins/
/wp-content/plugins/*
!/wp-content/plugins/plugin-name/
!/wp-content/plugins/plugin-name/*.*
!/wp-content/plugins/plugin-name/**

3

gitignore - अनदेखा करने के लिए जानबूझकर अनट्रैक की गई फ़ाइलों को निर्दिष्ट करता है।

विशिष्ट निर्देशिका फू / बार (नोट / * को ध्यान में रखते हुए - स्लैश के बिना, वाइल्डकार्ड भी फू / बार के भीतर सब कुछ बाहर कर देगा ) को छोड़कर सब कुछ बाहर करने के लिए उदाहरण :

$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar

वर्डप्रेस के लिए एक और उदाहरण :

!/wp-content
wp-content/*
!/wp-content/plugins
wp-content/plugins/*
!wp-content/plugins/my-awesome-plugin

यहाँ अधिक जानकारी: https://git-scm.com/docs/gitignore


2

मैं अक्सर सीएलआई में इस वर्कअराउंड का उपयोग करता हूं .gitignore, जहां मेरे कॉन्फ़िगर करने के बजाय , मैं एक अलग .includeफाइल बनाता हूं जहां मैं (उप) निर्देशिका को परिभाषित करता हूं जो मैं चाहता हूं कि निर्देशिकाओं के बावजूद सीधे या पुनरावर्ती द्वारा अनदेखा किया जाए।.gitignore

इस प्रकार, मैं इसके अतिरिक्त उपयोग करता हूं

git add `cat .include`

मंचन के दौरान, करने से पहले।

ओपी के अनुसार, मेरा सुझाव है कि .includeइन लाइनों का उपयोग करें:

<parent_folder_path>/application/language/gr/*

नोट: $ घर (या किसी अन्य विशिष्ट निर्देशिका) को निर्दिष्ट करने के लिए catउपनाम (भीतर .include) का उपयोग करने की अनुमति नहीं देता है । ऐसा इसलिए है क्योंकि उपरोक्त कमांड का उपयोग homedir/app1/* करने के लिए पास होने वाली लाइन के git addरूप में प्रकट होता है git add 'homedir/app1/*', और एकल उद्धरण ('') में वर्णों को घेरता है , उद्धरण के भीतर प्रत्येक वर्ण के शाब्दिक मूल्य को संरक्षित करता है, इस प्रकार उपनाम (जैसे होमडियर ) को कार्य करने से रोकता है (देखें दाना एकल उद्धरण )।

यहाँ एक .includeफ़ाइल का एक उदाहरण है जो मैं अपने रेपो में यहाँ उपयोग करता हूँ ।

/home/abhirup/token.txt
/home/abhirup/.include
/home/abhirup/.vim/*
/home/abhirup/.viminfo
/home/abhirup/.bashrc
/home/abhirup/.vimrc
/home/abhirup/.condarc

1

मैं jquery उत्पादन js फ़ाइलों को ट्रैक करना चाहता था और यह काम किया:

node_modules/*
!node_modules/jquery
node_modules/jquery/*
!node_modules/jquery/dist/*

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