Git मेरी निर्दिष्ट फ़ाइल को अनदेखा क्यों नहीं करता है?


191

मैंने निम्नलिखित पंक्ति को इसमें जोड़ा .gitignore:

sites/default/settings.php

लेकिन जब मैं टाइप git statusकरता हूं तो यह फाइल को अनस्टेज्ड फाइल के रूप में दिखाता है।

समस्या क्या है? अन्य सभी पैटर्न अच्छी तरह से काम करते हैं।



मुझे भी यही समस्या थी, तब मुझे पता चला कि मैंने अपनी .gitignore फ़ाइल को एक अलग ड्राइव पर सहेजा है: चेहरा-हथेली:
हेनरी चैन

अपनी रिपॉजिटरी में सामान रखना और उस पर होने वाले परिवर्तनों को अनदेखा करना एक बहुत बुरा विचार है।
येवगेनी अफानसेयेव

जवाबों:


364

सुनिश्चित करें कि आपके बनाओ .gitignoreकार्यशील निर्देशिका की जड़ में है, और उस निर्देशिका समय में git statusऔर कॉपी स्थिति उत्पादन से फ़ाइल का पथ और इसे में पेस्ट .gitignore

यदि वह काम नहीं करता है, तो संभावना है कि आपकी फ़ाइल Git द्वारा पहले ही ट्रैक कर ली गई है। के आउटपुट के माध्यम से आप इसकी पुष्टि कर सकते हैं git status। यदि फ़ाइल "अनट्रैक की गई फ़ाइलों" खंड में सूचीबद्ध नहीं है , तो यह पहले से ही गिट द्वारा ट्रैक किया गया है और यह .gitignoreफ़ाइल से नियम की अनदेखी करेगा ।

Git में फ़ाइलों को अनदेखा करने का कारण यह है कि उन्हें रिपॉजिटरी में नहीं जोड़ा जाएगा। यदि आपने पहले कोई फ़ाइल जोड़ी है जिसे आप अनदेखा करना चाहते हैं, तो इसे Git द्वारा ट्रैक किया जाएगा और मेल खाने वाले नियमों को अनदेखा किया जाएगा। Git ऐसा करता है क्योंकि फ़ाइल पहले से ही रिपॉजिटरी का हिस्सा है।

वास्तव में फ़ाइल को अनदेखा करने के लिए, आपको इसे अनट्रैक करना होगा और इसे रिपॉजिटरी से निकालना होगा। का उपयोग करके आप ऐसा कर सकते हैं git rm --cached sites/default/settings.php। यह फ़ाइल को भौतिक रूप से हटाने के बिना रिपॉजिटरी से फ़ाइल को हटा देता है (यही --cachedहै)। उस परिवर्तन को करने के बाद, फाइल को रिपॉजिटरी से हटा दिया जाएगा, और इसे अनदेखा करना ठीक से काम करना चाहिए।


'वर्किंग डायरेक्टरी की जड़' से आपका क्या तात्पर्य है? वह निर्देशिका जहां '.git' भंडार पाया जाता है?
जोनाथन लेफ्लर

कामकाजी निर्देशिका वह निर्देशिका है जिसमें .gitनिर्देशिका स्थित है और जो स्वयं भंडार है। जैसे जब आप एक रिपॉजिटरी का क्लोन बनाते हैं, /xy/तो /xy/आपकी वर्किंग डायरेक्टरी /xy/.git/अंदर से होती है।
प्रहार

3
कभी-कभी आपको सूचकांक को ठीक से पुनर्निर्माण करने के git add .बाद भी करने की आवश्यकता होगी git rm --cached
कूपर

गिट स्थिति में इसे जांचने का विचार शानदार था। मैं इसे ग्रहण में गेट स्टेजिंग में जाँचता रहा और रास्ता गलत था। धन्यवाद!
वाल्ला

1
मुझे -r (पुनरावर्ती) ध्वज जोड़ने की आवश्यकता थी क्योंकि मेरे पास नेस्टेड फ़ोल्डर भी थे। मेरे मामले में मैं अपने git फ़ोल्डर की जड़ में चला गया, फिर कमांड git rm --cached -r .vs / जहाँ बनाम शीर्ष-स्तरीय फ़ोल्डर चला, जिसे मैं ट्रैकिंग से हटाना चाहता था।
Devology Ltd

105

मैं इसमें शामिल हूं, यह एक पुराना सवाल है, लेकिन मैं चाहता हूं कि उस फाइल को ट्रैक किया जाए, लेकिन इसे कुछ निश्चित प्रतियों पर ट्रैक नहीं किया जाए, ताकि आप इसे चला सकें

git update-index --assume-unchanged sites/default/settings.php

5
यह वास्तव में वह उत्तर है जिसकी मुझे तलाश थी। अन्य सभी उत्तर मानते हैं कि फ़ाइल को गिट ऐड के साथ जोड़ा गया था, जो हमेशा ऐसा नहीं होता है। एक्विआ क्लाउड के साथ .gitignore फ़ाइल सेटिंग्स को अनदेखा करने वाली है। उदाहरण (उदाहरण के लिए) लेकिन फ़ाइल पहली प्रतिबद्ध के साथ शामिल है। फ़ाइल को अनट्रैक करना, बस उसे रिपॉजिटरी से हटा देता है, इसलिए इसे लाइव साइट से हटा रहा है ...
PatrickS

मेरी भी मदद की - धन्यवाद! वोट दिया। मुझे संदेह है कि यह केवल स्थानीय गिट रेपो पर लागू होता है और एक बार रिमोट और अन्य देवों द्वारा क्लोन करने के लिए जारी नहीं रहेगा?
इवान

1
हाँ, यह केवल स्थानीय है।
मेस्कालिटो

40

.ITignore केवल उन फ़ाइलों को अनदेखा करेगा, जिन्हें आपने अपनी रिपॉजिटरी में पहले से नहीं जोड़ा है।

यदि आपने किया git add ., और फ़ाइल इंडेक्स में जुड़ गई, तो .ignignore आपकी मदद नहीं करेगा। आपको इसे git rm sites/default/settings.phpहटाने के लिए करने की आवश्यकता होगी , और फिर इसे अनदेखा किया जाएगा।


धन्यवाद। लेकिन मैं केवल इंडेक्स से फ़ाइल को कैसे निकालूं और वर्किंग डायरेक्टरी से नहीं?
Nick.h

1
git rmऐसा करना चाहिए, लेकिन यह आपको -f विकल्प का उपयोग करने के लिए कह सकता है जो इसे कार्यशील निर्देशिका से हटा देगा। मैंने यह पता नहीं लगाया है कि फ़ाइल की एक प्रतिलिपि बनाने के अलावा, कॉपी को git rm -fपुनर्स्थापित करें।
जोंसकब

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

17

कृपया इस कमांड का उपयोग करें

git rm -rf --cached .
git add .

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


12

मुझे भी यही समस्या थी। फ़ाइलों को परिभाषित किया गया है .gitingoreजहाँ चलाने के दौरान अनटैक की गई फ़ाइलों के रूप में सूचीबद्ध किया गया है git status

कारण यह था कि .gitignoreफ़ाइल UTF-16LEएन्कोडिंग में सहेजी गई थी , और UTF8एन्कोडिंग में नहीं ।

.gitignoreफ़ाइल के एन्कोडिंग को बदलने के बाद UTF8इसने मेरे लिए काम किया।


मैं इस वजह से एक noob की तरह लग रहा है ... खतरे यह विंडोज
Coty Embry

किसी भी विचार क्यों फ़ाइल एन्कोडिंग मायने रखती है? शायद ठीक से पढ़ने का रास्ता नहीं?
२०:०६

2

क्या मैं अनदेखी करने के लिए यह किया settings.php फ़ाइल सफलतापूर्वक:

  1. git rm - कैश की गई साइटें / डिफ़ॉल्ट / settings.php
  2. प्रतिबद्ध (यहाँ तक काम नहीं किया)
  3. मैन्युअल रूप से हटाई गई साइटें / डिफ़ॉल्ट / settings.php (यह चाल चली)
  4. जोड़ देना।
  5. प्रतिबद्ध (सफलतापूर्वक अनदेखा)

मुझे लगता है कि अगर वहाँ Git पर प्रतिबद्ध फ़ाइल है तो अनदेखा करना अपेक्षित रूप से काम नहीं करता है। बस फाइल को डिलीट करें और कमिट करें। बाद में इसे अनदेखा करेंगे।


2

ऐसे उदाहरण हैं जैसे कि एप्लिकेशन कॉन्फ़िगरेशन फाइलें, जो मैं git में ट्रैक करना चाहता हूं (ताकि .ignignore काम नहीं करेगा), लेकिन मुझे स्थानीय सेटिंग्स के लिए बदलने की आवश्यकता है। मैं इन फ़ाइलों को प्रबंधित करने या उन्हें संशोधित के रूप में दिखाने के लिए गिट नहीं चाहता। ऐसा करने के लिए मैं स्किप-वर्कट्री का उपयोग करता हूं:

git update-index --skip-worktree path/to/file

आप पुष्टि कर सकते हैं कि फाइलों को सूचीबद्ध करके और स्केप के लिए S से शुरू होने वाली लाइनों की जाँच करके फ़ाइलों को छोड़ दिया जाता है

git ls-files -v | grep ^S

यदि भविष्य में आप चाहते हैं कि स्थानीय रूप से फ़ाइल को फिर से प्रबंधित करें तो बस चलाएं:

 git update-index --no-skip-worktree path/to/file

ऊपर मेस्कालिटो का शानदार जवाब था, जिसने मुझे सही रास्ते पर ले जाया लेकिन

git update-index --assume-अपरिवर्तित फ़ाइल / to / ign.php

Git के साथ एक अनुबंध किया गया है जिसमें: उपयोगकर्ता फ़ाइल को नहीं बदलने का वादा करता है और Git को यह मानने की अनुमति देता है कि कार्यशील ट्री फ़ाइल उस सूची से मेल खाती है जो सूचकांक में दर्ज की गई है।

हालांकि, मैं फ़ाइलों की सामग्री को बदल देता हूं, इसलिए मेरे मामले में --स्काइप-वर्कट्री बेहतर विकल्प है।

तोशारू निशिना की वेबसाइट ने स्किप-वर्कट्री बनाम धारणा-अपरिवर्तित की एक उत्कृष्ट व्याख्या प्रदान की: स्थानीय रूप से गिट के साथ पहले से प्रबंधित फ़ाइलों को अनदेखा करें


2

एक अन्य संभावित कारण - एक ही समय में चलने वाले गिट क्लाइंट के कुछ उदाहरण । उदाहरण के लिए "गिट शेल" + "गिटहब डेस्कटॉप", आदि।


यह मेरे साथ हुआ, मैं मुख्य ग्राहक के रूप में "गिटहब डेस्कटॉप" का उपयोग कर रहा था और यह कुछ नई .itignore सेटिंग्स की उपेक्षा कर रहा था: प्रतिबद्ध होने के बाद।

  1. आप कुछ करें।
  2. अगला, कमिट करें: यह .ignignore सेटिंग्स को अनदेखा करता है। कमिट में .gitignore में उल्लिखित बहुत सारी अस्थायी फाइलें शामिल हैं।
  3. स्पष्ट कैश; जांचें कि क्या .gitignore UTF8 है; फ़ाइलों को हटा दें -> प्रतिबद्ध -> फ़ाइलों को वापस ले जाएं; 1 प्रतिबद्ध छोड़ें - कुछ भी मदद नहीं की।

कारण : विजुअल स्टूडियो कोड एडिटर पृष्ठभूमि में उसी खोले गए भंडार के साथ चल रहा था। वीएस कोड में अंतर्निहित नियंत्रण है, और यह कुछ संघर्ष करता है।

समाधान : कई, छिपे हुए गिट क्लाइंटों की दोबारा जांच करें और एक बार में केवल एक जीआईटी ग्राहक का उपयोग करें, विशेषकर गिट कैश को साफ करते समय।


1

सुनिश्चित करें। .ignignore में एक्सटेंशन नहीं है !! यह नहीं हो सकता है। .ignignore.txt, विंडोज़ में सिर्फ फ़ाइल का नाम है। और यह काम करेगा।


0

मैंने सिर्फ 1.7.3.1 git के साथ यह कोशिश की, और एक संरचना दी:

repo/.git/
repo/.gitignore
repo/sites/default/settings.php

repoइस प्रकार जहां "रूट" ऊपर उल्लेख किया गया है (मैं इसे आपके काम करने वाले पेड़ की जड़ कहूंगा), और .gitignoreइसमें केवल शामिल है sites/default/settings.php, मेरे लिए इग्निशन काम करता है (और इससे कोई फर्क नहीं पड़ता कि .gitignoreरेपो में जोड़ा जाता है या नहीं)। क्या यह आपके रेपो लेआउट से मेल खाता है? यदि नहीं, तो क्या अलग है?


हाँ। यह बिल्कुल वैसा ही है जैसा आपका काम करता है। लेकिन अन्य पैटर्न काम नहीं करते हैं।
Nick.h

मुझे लगता है कि अपनी रिपॉजिटरी में सामान रखना और उस पर होने वाले बदलावों को नजरअंदाज करना बहुत बुरा विचार है।
येवगेनी अफानसेयेव

@YevgeniyAfanasyev संकलन आउटपुट, आईडीई उपयोगकर्ता सेटिंग्स, आपके टूलकिन द्वारा उत्पन्न सभी अन्य अस्थायी फ़ाइलों की तरह सामान को छोड़कर ...
क्रिस एफ कैरोल

मेरा मतलब था रिपोजिटरी में प्रतिबद्ध रहना, न कि केवल प्रोजेक्ट फ़ोल्डर में बैठी फाइलें। आपको रिपॉजिटरी में अस्थायी फ़ाइलों की आवश्यकता क्यों होगी?
येवगेनी अफनासायेव

0

बस अगर भविष्य में किसी को वही समस्या होती है जो मैंने की थी:

यदि आप उपयोग करते हैं

*
!/**/
!*.*

बिना एक्सटेंशन वाली बाइनरी फ़ाइलों को हटाने के लिए ट्रिक, सुनिश्चित करें कि अन्य सभी gitignore लाइनें BELOW हैं। Git ऊपर से .gitignore से पढ़ेगा, इसलिए भले ही मेरे पास मेरे gitignore में 'test.go' था, यह पहली बार फाइल में था, और इसके बाद 'unignored' बन गया

!*.*

0

मैंने वीएस कोड टर्मिनल पर ऊपर की अधिकांश कमांड की कोशिश की और मुझे त्रुटियां मिलीं जैसे:

fatal: pathspec '[dir]/[file]' did not match any files

मैंने GitHub डेस्कटॉप पर प्रोजेक्ट खोला और वहाँ से अनदेखा किया और यह काम किया।

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