मैं स्थानीय रूप से कुछ फ़ाइलों को अनदेखा करने के लिए git को कैसे कॉन्फ़िगर करूं?


1349

क्या मैं अन्य सभी के लिए वैश्विक गिट कॉन्फिग को प्रदूषित किए बिना स्थानीय रूप से फाइलों को अनदेखा कर सकता हूं? मेरे पास ऐसी असंबंधित फाइलें हैं जो मेरे git स्टेटस में स्पैम हैं, लेकिन मैं अपनी स्थानीय शाखाओं में मौजूद हर एक छोटी यादृच्छिक अनट्रैक फ़ाइल के लिए git config परिवर्तन नहीं करना चाहता।

जवाबों:


1859

से प्रासंगिक Git प्रलेखन :

पैटर्न जो एक विशेष रिपॉजिटरी के लिए विशिष्ट हैं, लेकिन जिन्हें अन्य संबंधित रिपॉजिटरी के साथ साझा करने की आवश्यकता नहीं है (उदाहरण के लिए, सहायक फाइलें जो रिपॉजिटरी के अंदर रहती हैं, लेकिन एक उपयोगकर्ता के वर्कफ़्लो के लिए विशिष्ट हैं) $GIT_DIR/info/excludeफ़ाइल में जाना चाहिए ।

.git/info/excludeजिसे किसी भी रूप में एक ही प्रारूप है .gitignoreफ़ाइल। एक अन्य विकल्प core.excludesFileवैश्विक पैटर्न वाले फ़ाइल के नाम पर सेट करना है।

ध्यान दें, यदि आपके पास पहले से अस्थिर परिवर्तन हैं, तो आपको अपने इग्नोर-पैटर्न को संपादित करने के बाद निम्नलिखित को चलाना होगा:

git update-index --assume-unchanged <file-list>

पर ध्यान दें$GIT_DIR : यह एक संकेतन प्रयोग किया जाता है पर सभी बस Git भंडार के लिए पथ इंगित करने के लिए Git मैनुअल। यदि पर्यावरण चर सेट किया गया है, तो यह आपके द्वारा किए जाने वाले रेपो के स्थान को ओवरराइड कर देगा, जो शायद आप नहीं चाहते हैं।


संपादित करें : उपयोग करने का एक और तरीका है:

git update-index --skip-worktree <file-list>

इससे उल्टा करें:

git update-index --no-skip-worktree <file-list>

204
नोट के रूप में, git update-index --assume-unchanged [<file>...]अपवर्जित फ़ाइल के अतिरिक्त बनाने के बाद चलना सुनिश्चित करें । तब तक परिवर्तन नहीं उठाए जाएंगे।
टॉलमेनज़

30
मुझे परिवर्तन 1.7.9.5 का उपयोग करने के लिए परिवर्तन के लिए 'git अपडेट-इंडेक्स ...' चलाने की आवश्यकता नहीं थी।
जेफरी मार्टिनेज

39
यदि आपने पहले ही फाइल में बदलाव कर लिया है और अब इसे नजरअंदाज करना चाहते हैं तो आपको केवल git अपडेट-इंडेक्स का उपयोग करना होगा। यदि आप परिवर्तन करने से पहले बाहर कर देते हैं, तो यह आवश्यक नहीं है।
ब्रैडी इमर्सन

13
हालांकि यह फ़ाइल को कमिट करने के दौरान जैसे कि .ignignore के रूप में परिवर्तित होने से प्रकट होने से रोकता है, अनदेखा फ़ाइलों के विपरीत, फ़ाइल (s) अभी भी रेपो संस्करण में वापस रीसेट हो जाएगी यदि आप git रीसेट --hard निष्पादित करते हैं।
ब्रैडी इमर्सन

19
प्रति stackoverflow.com/questions/23097368/… और stackoverflow.com/questions/13630849/… , skip-worktreeसंभवतः पसंद किया जाएगा assume-unchanged
danShumway

436

अपडेट : git update-index --skip-worktree [<file>...]इसके बजाय का उपयोग करने पर विचार करें , धन्यवाद @danShumway! दो विकल्पों के अंतर पर बोरेलिड की व्याख्या देखें ।


पुराना उत्तर:

यदि आपको ट्रैक की गई फ़ाइलों में स्थानीय परिवर्तनों को अनदेखा करने की आवश्यकता है (हमारे पास फ़ाइलों को कॉन्फ़िगर करने के लिए स्थानीय संशोधनों के साथ), का उपयोग करें git update-index --assume-unchanged [<file>...]


8
बस ध्यान देने के लिए, मैंने $ GIT_DIR / जानकारी / बहिष्कृत (जैसे, my-file.php) में एक फ़ाइल जोड़ी और फिर git update-index --assume-unchanged my-file.phpइसे अनदेखा करना शुरू करने के लिए दौड़ना पड़ा । पारितोषिक के लिए धन्यवाद!
टॉलमेनज़

78
इसे पूर्ववत करने के लिए: git update-index --no-assume-unchanged my-file.php
रे

18
बस स्पष्टीकरण के लिए: मान-अपरिवर्तित (रेपो में मौजूद हैं) पर नज़र रखी फ़ाइलों के लिए है ... ओ पी ट्रैक न किए गए फ़ाइलों के लिए पूछ रहा था, जिसमें मामले .git/info/excludeक्या आप (अक्सर साझा किया और पता लगाया .gitignore प्रदूषण से बचने के लिए) चाहते है
dyodji

7
के अनुसार stackoverflow.com/questions/23097368/... इस असुरक्षित माना जाता है, और आपकी फ़ाइलों अभी भी प्रतिबद्ध किया जा सकता है अगर आप सावधान नहीं कर रहे हैं। यह एक प्रदर्शन सहायता के रूप में है, न कि इस समस्या के एक मूर्खतापूर्ण समाधान के रूप में।
danShumway

3
--assume-unchangedआपके अपडेट को पढ़ने से पहले मैं रवाना हुआ । मैं के साथ अविश्वास --no-assume-unchangedऔर फिर किया था --skip-worktree... मैं स्पष्ट में हूँ?
निकोलस मियारी

162

अपनी .gitconfig फ़ाइल के [उपनाम] अनुभाग में निम्न पंक्तियाँ जोड़ें

ignore = update-index --assume-unchanged
unignore = update-index --no-assume-unchanged
ignored = !git ls-files -v | grep "^[[:lower:]]"

अब आप git ignore my_fileस्थानीय फ़ाइल में परिवर्तनों को अनदेखा करने और परिवर्तनों को अनदेखा करने के लिए उपयोग कर सकते हैं git unignore my_filegit ignoredनजरअंदाज की गई फाइलों को सूचीबद्ध करता है।

यह उत्तर http://gitready.com/intermediate/2009/02/18/temporately-ignoring-files.html से प्राप्त किया गया था ।


1
"! git ls-files -v | grep" ^ [[: निचला:]] "- कोई भी मौका जिसे आप जानते हैं कि यह कैसे करना है विंडोज cmd पर?
Haohmaru

3
एक वास्तविक शेल स्थापित करें (उदाहरण के लिए बाबून बाश या zsh प्रदान करता है);) मैं आपकी भावनाओं को जानता हूं, लेकिन मैंने हाल ही में विंडोज से लिनक्स पर स्विच किया है और मैं कभी भी cmd का उपयोग नहीं करूंगा।
ज़ेरुस

@ होहमारू, आप हमेशा WSL ​​(लिनक्स के लिए विंडोज सबसिस्टम) का उपयोग कर सकते हैं।
एक Sz

110

आपके पास कई विकल्प हैं:

  • .gitignoreअपनी वर्किंग डायर में एक गंदी (या अनकम्फर्ड) फाइल छोड़ दें (या इसे अपने आप टॉपगिट या कुछ अन्य ऐसे पैच टूल का उपयोग करके लागू करें )।
  • अपनी $GIT_DIR/info/excludeफ़ाइल में बहिष्करण डालें , यदि यह एक पेड़ के लिए विशिष्ट है।
  • चलाएं git config --global core.excludesfile ~/.gitignoreऔर अपने पैटर्न जोड़ें ~/.gitignore। यह विकल्प लागू होता है यदि आप सभी पेड़ों में कुछ पैटर्न को अनदेखा करना चाहते हैं। मैं उदाहरण के लिए .pycऔर .pyoफ़ाइलों के लिए इसका उपयोग करता हूं ।

इसके अलावा, सुनिश्चित करें कि आप पैटर्न का उपयोग कर रहे हैं और जब लागू हो तो स्पष्ट रूप से फाइलों की गणना नहीं कर रहे हैं।


10
मुझे लगता है कि आपको git config --globalविश्व स्तर पर विकल्प निर्धारित करने की आवश्यकता है।
जोश ली

7
वास्तव में, बस .gitignore को .gitignore;) में जोड़ें;
डोमिनिक जॉर्ज

68

मुझे लगता है कि आप देख रहे हैं:

git update-index --skip-worktree FILENAME

जो स्थानीय किए गए परिवर्तनों को अनदेखा करता है

यहाँ http://devblog.avdi.org/2011/05/20/keep-local-modifications-in-git-tracked-files/ इन समाधानों के बारे में अधिक विवरण दिया गया है!

पूर्ववत उपयोग के लिए:

git update-index --no-skip-worktree FILENAME

9
वहाँ के बीच एक प्रासंगिक चर्चा है --skip-worktreeऔर --assume-unchangedपर यह तो सवाल
Merwer

1
मैं इसे कैसे पूर्ववत करूंगा, या उन फ़ाइलों / पैटर्नों की सूची देखूंगा, जिन्हें वर्तमान में नजरअंदाज किया जा रहा है --skipworktree, क्या मुझे बाद में अपना दिमाग बदल देना चाहिए और फाइल को फिर से ट्रैक करना शुरू करना चाहिए?
विसंगति

1
इसे पूर्ववत कैसे करें?
user1735921

3
पूर्ववत करने के लिए कृपया उपयोग करेंgit update-index --no-skip-worktree <file>
user1735921

49

इस प्रक्रिया को सरल बनाने के लिए आप कुछ git उपनाम स्थापित कर सकते हैं । यह [alias]आपकी .gitconfigफ़ाइल के नोड को संपादित करता है ।

git config --global alias.ignore 'update-index --skip-worktree'
git config --global alias.unignore 'update-index --no-skip-worktree'
git config --global alias.ignored '!git ls-files -v | grep "^S"'

आपके लिए इंस्टॉल किए गए शॉर्टकट इस प्रकार हैं:

  • git ignore config.xml
    • git यह दिखाएगा कि यह किसी भी बदलाव को नहीं देखता है config.xml- आपको गलती से उन परिवर्तनों को रोकने से रोकता है।
  • git unignore config.xml
    • git आपके परिवर्तनों को स्वीकार करते हुए फिर से शुरू करेगा config.xml- आपको उन परिवर्तनों को करने की फिर से अनुमति देगा।
  • git ignored
    • git उन सभी फाइलों को सूचीबद्ध करेगा, जिन्हें आप ऊपर वर्णित तरीके से "अनदेखा" कर रहे हैं।

मैंने इन्हें फातमान के उत्तर का उल्लेख करके बनाया है - जो --assume-unchangedउसी का एक संस्करण प्रस्तुत करता है ।

जो संस्करण मैं प्रस्तुत करता हूं वह --skip-worktreeस्थानीय परिवर्तनों को अनदेखा करने के लिए उपयोग करता है । अंतर की पूरी व्याख्या के लिए बोरेलिड का उत्तर देखें , लेकिन अनिवार्य रूप --skip-worktreeसे इसका उद्देश्य डेवलपर्स को अपने परिवर्तनों को करने के जोखिम के बिना फ़ाइलों को बदलना है

git ignoredआदेश यहां प्रस्तुत का उपयोग करता है git ls-files -v, और सिर्फ उन प्रविष्टियों के साथ शुरुआत दिखाने के लिए सूची फिल्टर Sटैग। Sटैग एक फ़ाइल जिसका स्थिति "worktree छोड़" को दर्शाता है। द्वारा दिखाए गए फ़ाइल स्थितियों की पूरी सूची के लिए git ls-files: -tविकल्प के लिए प्रलेखन देखें git ls-files


1
यह अनटैक की गई फ़ाइलों के लिए काम नहीं करता है: <(git 2.13.5 osx पर)
टेरा एशले

है '!' में होना चाहिए '!git ls-files -v | grep "^S"'? कमांड मेरे साथ वहाँ पर काम नहीं करता है .. और लगता है कि इसे हटा दिया गया है।
टिरिस

git उपनाम में विस्मयादिबोधक चिह्न एक git उपकमांड के बजाय git को एक बाहरी कमांड चलाने के लिए कहता है । मैंने इसे इसलिए डाला क्योंकि मुझे शेल पाइपलाइन की आवश्यकता है, इसलिए मुझे बाहर से गिट लगाने की जरूरत है। मैंने केवल विस्मयादिबोधक चिह्न (आपकी सिफारिश के अनुसार) को हटाने की कोशिश की, लेकिन यह मेरे लिए काम नहीं करता है। मुझे मिलता है । यह समझ में आता है; विस्मयादिबोधक चिह्न के बिना: git उपनाम आपके आदेश को । Expansion of alias 'ignored' failed; 'git' is not a git commandgit git ls-files …
बिर्चलैब्स 13

स्पष्टीकरण के लिए धन्यवाद। मैं git उपनाम से परिचित नहीं हूं और केवल उपनाम बनाने से पहले परीक्षण करने के लिए शेल में चल रहा था।
टिरिस

यह एक शानदार समाधान है। चूंकि प्रति निर्देशिका गिट ट्रैक, जब आप उपरोक्त उपनाम चलाते हैं git ignore <filename>, तो यह केवल उस निर्देशिका पर लागू होता है। और जब आप अंततः उस फ़ाइल में अपने परिवर्तन करना चाहते हैं और कमिट करना चाहते हैं और रिमोट से पुश करना चाहते हैं, तो बस git unignore <filename>अस्थायी रूप से इसे फिर से ट्रैक करने के लिए काम का उपयोग करें! धन्यवाद!
निकंग

42

आप बस अपने । निर्देशिका के लिए .gitignore फ़ाइल जोड़ सकते हैं, $HOME/.gitignoreया ~/.gitignore। फिर उस फाइल को कमांड के साथ उपयोग करने के लिए git को बताएं:

git config --global core.excludesfile ~/.gitignore

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

मैं महान परिणामों के साथ वर्षों से इस दृष्टिकोण का उपयोग कर रहा हूं।


धन्यवाद, @ EricChen मैंने asswer को अपडेट किया है; कोशिश करें और फिर git check-ignore <file-name>सत्यापित करने के लिए उपयोग करें। LMK अगर यह आपके लिए काम करता है
JESii

इसने केवल मेरे लिए ही काम किया =:git config --global core.excludesfile ~/.gitignore
ई। सुंदरिन

मैंने एक .gitignoreफाइल होम डायरेक्टरी के तहत रखी और कहा कि इसके बजाय उस फाइल का उपयोग करने के लिए git को बताया, फिर उन फाइल्स को डिलीट कर दिया जिन्हें मैं स्थानीय रूप से अनट्रैक करना चाहता हूं। हालाँकि, मैंने परिवर्तनों को आगे बढ़ाने के बाद, दूरस्थ रिपॉजिटरी ने उन फ़ाइलों को भी हटा दिया। क्या मैंने कुछ गलत किया?
zyy

वाह, @xyz; .gitignoreआपके स्थानीय निर्देशिका में मौजूद फ़ाइलों को अनदेखा करने के बारे में है। आपको git rm --cachedजो करना चाहिए था, जो उन्हें रेपो से निकालता है लेकिन आपके स्थानीय में छोड़ देता है। आपको अपनी पिछली प्रतिबद्धताओं पर वापस जाने में सक्षम होना चाहिए, git reset --soft HEAD^जो आपकी फ़ाइलों को कम करने और पुनर्प्राप्त करने के लिए कुछ करना चाहते हैं । यह सौंदर्य की सुंदरता है: यह अभी भी आपके इतिहास में है।
JESii

2

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


1
महान! FYI करें: यह केवल इसलिए काम करता है क्योंकि git केवल ट्रैक करता है (और आपको कमिट करने देता है), फ़ोल्डर्स नहीं।
jmiserez

-2

यदि आपके रेपो में पहले से एक .gitignore फ़ाइल नहीं है, तो एक साधारण समाधान एक .gitignore फ़ाइल बनाने के लिए है, और इसमें .gitignoreफ़ाइलों की सूची को अनदेखा करने के लिए जोड़ें ।


4
और क्या होगा अगर टीम बाद में एक gitignore जोड़ना चाहती है? क्या यह भी काम करता है? एक भयानक विचार की तरह लगता है और कुछ ऐसा है जो काम भी नहीं करना चाहिए।
ब्योर्न

इस आदमी के जवाब ने मुझे फटा दिया। किसी भी तरह से कोई भी ऐसा नहीं कर रहा है।
मार्टिन चैम्बरलिन

यह एक त्वरित और सरल उपाय है, जब तक कि इसे लगाने के लिए एक जगह है। हमारे रेपो में .gitignoreशीर्ष पर एक साझा फ़ाइल है। लेकिन मेरी गंदी फाइलें एक गहरे फ़ोल्डर में हैं, इसलिए मैंने बस .gitignoreउनके बगल में अपना जोड़ा । +1
joeytwiddle
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.