सवाल गिट को एक फ़ाइल के बारे में "भूल जाओ" कैसे ट्रैक किया गया था लेकिन अब .gitignore में है?


एक फाइल है जिसे ट्रैक किया जा रहा था git, लेकिन अब फाइल चालू है .gitignore सूची।

हालांकि, वह फ़ाइल दिखती रहती है git status संपादित करने के बाद। आप कैसे मजबूर करते हैं git इसके बारे में पूरी तरह से भूलने के लिए?


3665
2017-08-13 19:23


मूल


git clean -X समान लगता है, लेकिन यह इस स्थिति में लागू नहीं होता है (जब फाइलें अभी भी गिट द्वारा ट्रैक की जा रही हैं)। मैं इसे किसी ऐसे समाधान के लिए लिख रहा हूं जिसके लिए गलत मार्ग का पालन न किया जाए। - imz -- Ivan Zakharyaschev
इसका एकमात्र असली जवाब नीचे दिया गया है, देखें git update-index --assume-unchanged। यह समाधान 1) फ़ाइल को सर्वर (इंडेक्स) पर रखता है, 2) आपको इसे स्थानीय रूप से स्वतंत्र रूप से संशोधित करने देता है। - Qwerty
आपको उपयोग करने की ज़रूरत है --skip-worktree, देख: stackoverflow.com/questions/13630849/... - Doppelganger
एक महत्वपूर्ण सवाल यह है: क्या फाइल को भंडार में रखना चाहिए या नहीं? उदाहरण के लिए अगर कोई नया क्लोन रेपो, तो उन्हें फाइल मिलनी चाहिए या नहीं? अगर हाँ फिर git update-index --assume-unchanged <file> सही है और फ़ाइल भंडार में रहेगी और परिवर्तनों के साथ जोड़ा नहीं जाएगा git add। अगर नहीं (उदाहरण के लिए यह कुछ कैश फ़ाइल, जेनरेट की गई फाइल आदि थी), फिर git rm --cached <file> इसे भंडार से हटा देगा। - Martin
@ मार्टिन @ क्वर्टी प्रत्येक को सलाह देना बंद कर देना चाहिए --assume-unchanged जो गिट को बड़ी ट्रैक की गई फाइलों की स्थिति की जांच करने के लिए प्रदर्शन के लिए है, लेकिन पसंद करते हैं --skip-worktree जो संशोधित ट्रैक की गई फ़ाइलों के लिए है जो उपयोगकर्ता अब और प्रतिबद्ध नहीं करना चाहते हैं। देख stackoverflow.com/questions/13630849/... - Philippe


जवाब:


.gitignore अनचाहे फ़ाइलों को जोड़ने से रोक देगा (बिना add -f) गिट द्वारा ट्रैक की गई फ़ाइलों के सेट पर, हालांकि गिट किसी भी फाइल को ट्रैक करना जारी रखेगा जिसे पहले ही ट्रैक किया जा रहा है।

फ़ाइल को ट्रैक करना बंद करने के लिए आपको इसे इंडेक्स से निकालना होगा। यह इस आदेश के साथ हासिल किया जा सकता है।

git rm --cached <file>

मुख्य संशोधन से फ़ाइल को हटाने के बाद अगली प्रतिबद्धता होगी।


3887
2017-08-13 20:40



मेरे लिए काम की गई प्रक्रिया 1 थी। पहले लंबित परिवर्तनों को प्रतिबद्ध करें 2. git rm --cached <file> और फिर से प्रतिबद्ध करें 3. फ़ाइल को .gitignore में जोड़ें, गिट स्थिति के साथ जांचें और फिर से प्रतिबद्ध करें - mataal
बहुत महत्वपूर्ण जोड़ना। अगर अनदेखा की गई फ़ाइल को संशोधित किया जाएगा (लेकिन इसके बावजूद इसे प्रतिबद्ध नहीं किया जाना चाहिए), संशोधित करने और निष्पादित करने के बाद git add . यह सूचकांक में जोड़ा जाएगा। और अगली प्रतिबद्धता इसे भंडार में प्रतिबद्ध करेगी। इस निष्पादन से बचने के लिए उस मताल ने एक और आदेश कहा: git update-index --assume-unchanged <path&filename> - Dao
@ अकीरा यममोतो की विधि ने भी मेरे लिए अच्छा काम किया। मेरे मामले में मैंने आउटपुट दबा दिया क्योंकि मेरे भंडार में हजारों फाइलें थीं: git rm -r -q --cached . - Aaron Blenkush
यह फाइल को हटा देगा git pull हालांकि। - Petr Peller
git rm --cached <file> बस रिपोजिटरी से फ़ाइल को हटाएं, गिट अपडेट-इंडेक्स - वॉल्यूम-अपरिवर्तित <file> अस्थिर परिवर्तनों में फ़ाइल नहीं दिखाया गया है और यह कोई नया परिवर्तन नहीं खींचता है। लेकिन मैं फ़ाइल की जस्ट जस्ट इग्नोर सामग्री चाहता हूं - Igor Semin


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

प्रथम:

git rm -r --cached . 
git add .

फिर:

git commit -am "Remove ignored files"

1997
2017-09-30 13:51



इस उत्तर और स्वीकृत एक के बीच अंतर को हाइलाइट करने के लिए: इस आदेश का उपयोग करके आपको प्रभावित फ़ाइलों को वास्तव में जानने की आवश्यकता नहीं है। (यादृच्छिक फाइलों के साथ एक अस्थायी डीआईआर की कल्पना करें जिसे इंडेक्स से साफ़ किया जाना चाहिए)। - Ludwig
स्वीकृत उत्तर के समान। फाइलें हटा दी जाएंगी git pull। - Petr Peller
यह एक मानक गिट कमांड के रूप में होना अच्छा लगेगा। कुछ इस तरह git rmignored। - Berik
@gudthing -r "रिकर्सिव" के लिए खड़ा है - Monkey King
इसके साथ आप जोड़ना समाप्त कर सकते हैं अन्य बेकार फाइलें जो वर्तमान में नहीं हैं .gitignore। यह पता लगाना मुश्किल हो सकता है कि आपके शोर के आधार पर क्या git status इस आदेश के बाद है। एक आदेश है कि केवल हटा देता है नई अनदेखी फाइलें बेहतर होंगी। यही कारण है कि मैं पसंद करता हूँ thSoft का जवाब - KurzedMetal


गिट अपडेट-इंडेक्स मेरे लिए नौकरी करता है:

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

ध्यान दें: यह समाधान वास्तव में स्वतंत्र है .gitignore क्योंकि गिटिग्नोर केवल अनचाहे फ़ाइलों के लिए है।

संपादित करें: चूंकि यह उत्तर पोस्ट किया गया था, इसलिए एक नया विकल्प बनाया गया है और इसे प्राथमिकता दी जानी चाहिए। आपको उपयोग करना चाहिए --skip-worktree जो संशोधित ट्रैक की गई फ़ाइलों के लिए है जो उपयोगकर्ता अब और प्रतिबद्ध नहीं करना चाहते हैं --assume-unchanged बड़ी ट्रैक वाली फ़ाइलों की स्थिति की जांच करने के लिए गिट को रोकने के प्रदर्शन के लिए। देख https://stackoverflow.com/a/13631525/717372 अधिक जानकारी के लिए...


740
2017-11-27 11:24



इस है वास्तविक जवाब वास्तव में बहुत बढ़िया, बहुत सरल, प्रदूषित नहीं करता है git status और वास्तव में बहुत सहज ज्ञान युक्त। धन्यवाद। - Pablo Olmos de Aguilera C.
मैं काफी अच्छे के लिए गया था rm [...] . समाधान, कम से कम मैं यह सोच सकता था कि यह कैसे काम करता है। मुझे क्या कोई महान दस्तावेज नहीं मिला update-index और --assume-unchanged कर। क्या कोई यह जोड़ सकता है कि यह दूसरे से कैसे तुलना करता है, उसमें मैं उन सभी फ़ाइलों को हटाना चाहूंगा जिन्हें अनदेखा किया गया होगा? (या स्पष्टीकरण स्पष्ट करने के लिए एक लिंक?) - Brady Trainor
git update-index --assume-unchanged <path> … गिट को निर्दिष्ट पथ (ओं) में परिवर्तनों को अनदेखा करने के कारण, इस पर ध्यान दिए बिना .gitignore। यदि आप रिमोट से खींचते हैं और उस रिमोट में इस पथ में बदलाव आया है, तो गिट एक विवाद के साथ विलय विफल हो जाएगा और आपको मैन्युअल रूप से विलय करने की आवश्यकता होगी। git rm --cached <path> … गिट को उस पथ को ट्रैक करना बंद कर देगा। यदि आप पथ नहीं जोड़ते हैं .gitignore आप भविष्य में रास्ता देखेंगे git status। गिट प्रतिबद्ध इतिहास में पहला विकल्प कम शोर है और भविष्य में "अनदेखा" फ़ाइल को वितरित करने की अनुमति देता है। - ManicDee
उपयोग करके पूर्ववत करें: गिट अपडेट-इंडेक्स --no-assume-अपरिवर्तित <file> - xgMz
मैं काफी उलझन में हूं कि यह स्वीकार्य उत्तर कैसे नहीं है। यहां स्वीकृत उत्तर स्पष्ट रूप से पूछे जाने वाले वास्तविक प्रश्न का उत्तर नहीं दे रहा है। यह उत्तर रिपॉजिटरी में मौजूद फ़ाइल में परिवर्तनों को अनदेखा करता है जबकि इसे भंडार से नहीं हटाया जाता है। - Dave Cooper


git ls-files --ignored --exclude-standard -z | xargs -0 git rm --cached
git commit -am "Remove ignored files"

यह अनदेखा फ़ाइलों की सूची लेता है और उन्हें इंडेक्स से हटा देता है, फिर परिवर्तन करता है।


218
2018-05-23 22:29



यदि आपको उन्हें कार्यशील निर्देशिका से भी हटाना है, तो बस चलाएं git ls-files --ignored --exclude-standard | xargs git rm । मेरा मानना ​​है कि यह जवाब सबसे अच्छा है! चूंकि यह बहुत स्पष्ट है, यूनिक्स-मार्ग, और वांछित चीज़ को सीधे तरीके से करता है, बिना किसी जटिल कमांड के दुष्प्रभावों को लिखने के। - imz -- Ivan Zakharyaschev
बहुत बढ़िया जवाब; हालांकि, यदि आपके पास मध्य में रिक्त स्थान वाले पथ हैं, तो आदेश विफल हो जाएगा, उदाहरण: "मेरा dir / my_ignored_file.txt" - David Hernandez
git ls-files --ignored - exclude-standard | sed's / .*/"&"/ '| xargs गिट आरएम - कैश्ड - David Hernandez
git rm शिकायत करेंगे अगर ls-files कुछ भी मेल नहीं खाता उपयोग xargs -r git rm ... बताने के लिए xargs भागने के लिए नहीं git rm अगर कोई फाइल मेल नहीं खाती है। - Wolfgang
विभाजक के रूप में \ 0 का उपयोग करना बेहतर होगा: git ls-files --ignored --exclude-standard -z|xargs -0 git rm --cached - Nils-o-mat


मैं उन अनचाहे फ़ाइलों को हटाने के लिए हमेशा इस कमांड का उपयोग करता हूं। एक लाइन, यूनिक्स शैली, साफ आउटपुट:

git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached

यह आपकी सभी अनदेखी फाइलों को सूचीबद्ध करता है, प्रत्येक आउटपुट लाइन को उद्धृत रेखा के साथ प्रतिस्थापित करता है ताकि अंदर की जगहों के साथ पथ को संभाला जा सके और सब कुछ पास हो सके git rm -r --cached इंडेक्स से पथ / फाइल / डीआईआर को हटाने के लिए।


60
2018-06-19 15:42



महान समाधान! पूरी तरह से काम किया और अधिक सही महसूस करता है कि सभी फ़ाइलों को हटाकर उन्हें वापस जोड़ना। - Jon Catmull
मुझे भी यह "साफ" मिला। यह स्पष्ट हो सकता है, लेकिन केवल पहले भाग को चला रहा है, git ls-files --ignored --exclude-standard, अपने आप पर आपको पहली बार समझने / सत्यापित करने की सुविधा देता है कि आपकी नई फाइलें क्या हैं .gitignore आगे बढ़ने और अंतिम निष्पादित करने से पहले, बाहर / निकालने जा रहा है git rm। - JonBrave
सावधान रहें, उनमें कुछ निश्चित "बुरा" पात्रों के साथ फ़ाइल नामों में विफल रहता है, उदा। \n। मैंने इसके समाधान को पूरा करने के लिए अपना समाधान पोस्ट किया है। - JonBrave
एक और चेतावनी: खींचने पर, यह फाइल को दूसरों की कामकाजी निर्देशिकाओं में हटा दिया जाएगा, है ना? - LarsH


यदि तुम नही कर सकते git rm एक ट्रैक की गई फ़ाइल क्योंकि अन्य लोगों को इसकी आवश्यकता हो सकती है (चेतावनी, भले ही आप  git rm --cached, जब किसी और को यह परिवर्तन मिलता है, तो उनकी फाइलें उनके फाइल सिस्टम में हटा दी जाएंगी) कृपया देखें https://gist.github.com/1423106 जिस तरह से लोगों ने समस्या के आसपास काम किया है।


49
2017-07-19 00:08



गिट हटाने के समय गंदे होने पर गिट फ़ाइल को नहीं हटाएगा। और यदि यह गंदा नहीं है, तो फ़ाइल को पुनर्प्राप्त करना उतना ही आसान होगा git checkout <oldref> -- <filename> - लेकिन फिर यह जांच और अनदेखा किया जाएगा। - amenthes
जबकि यह सैद्धांतिक रूप से सवाल का जवाब दे सकता है, यह बेहतर होगा यहां उत्तर के आवश्यक हिस्सों को शामिल करने के लिए, और संदर्भ के लिए लिंक प्रदान करें। देख यहाँ निर्देशों के लिए कैसे लिखना है बेहतर "लिंक-आधारित" उत्तर। धन्यवाद! - GhostCat
बस केह रहा हू। 5 साल का जवाब, और 45 अपवॉट्स, लेकिन कोई भी यह बताने की हिम्मत नहीं करता कि "केवल लिंक ही खराब हैं?" - GhostCat


इसे बाहर ले जाएं, प्रतिबद्ध करें, फिर इसे वापस ले जाएं। इसने मेरे लिए अतीत में काम किया है। इसे पूरा करने के लिए शायद एक 'गिटियर' तरीका है।


44
2017-08-13 19:27



यह बहुत अच्छा काम करता है अगर आप उन फ़ाइलों के समूह को अनदेखा करना चाहते हैं जिन्हें पहले अनदेखा नहीं किया गया था। यद्यपि आपने कहा था, इसके लिए शायद एक बेहतर तरीका है। - Oskar Persson
यह वास्तव में वही है जो मैंने किया है। बस फ़ाइलों को गिट के बाहर किसी फ़ोल्डर में ले जाएं, फिर "गिट एड" करें, "गिट प्रतिबद्ध" करें। (इसने फ़ाइलों को हटा दिया) फिर गिटिनोरोर को जोड़ें, फाइलों / फ़ोल्डरों का संदर्भ लें, गिटिनोर फ़ाइल को गिट में जोड़ने के लिए फिर से प्रतिबद्ध करें, फिर फ़ोल्डर में कॉपी / वापस ले जाएं, और उन्हें अनदेखा किया जाना चाहिए। एनबी: यह दिखाई देगा कि फाइलों को जीआईटी से हटा दिया गया था, इसलिए शायद उन्हें उपरोक्त समाधानों में उल्लिखित अन्य चेकआउट / पुल से हटा दिया जाएगा, लेकिन चूंकि आप शुरुआत में उनकी प्रतियां बना रहे हैं, इसलिए यह आईएमएचओ जितना अधिक मुद्दा नहीं है। बस बाकी टीम को पता चलो ... - Del
गलत तरीके से प्रतिबद्ध फ़ोल्डर्स से छुटकारा पाने का यह सबसे आसान तरीका है। - Martlark
लगता है कि एकमात्र तरीका है, जिसे मैं देख सकता हूं। यह गिट में एक विशाल बग ('फीचर' नहीं है) जैसे ही आप फ़ाइल / फ़ोल्डर को .gitignore में जोड़ते हैं, यह उस फ़ाइल से उस फ़ाइल को केवल हमेशा के लिए अनदेखा नहीं करता है - हमेशा के लिए - हर जगह। - JosephK


मेरे लिए क्या काम नहीं किया

(लिनक्स के तहत), मैं यहां सुझावों का उपयोग करना चाहता था ls-files --ignored --exclude-standard | xargs git rm -r --cached दृष्टिकोण। हालांकि, (कुछ) फ़ाइलों को हटाने के लिए एक एम्बेडेड न्यूलाइन / एलएफ /\n उनके नामों में। समाधानों में से कोई भी नहीं:

git ls-files --ignored --exclude-standard | xargs -d"\n" git rm --cached
git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached

इस स्थिति से निपटें (फाइलों के बारे में त्रुटियां नहीं मिलीं)।

तो मैं पेशकश करता हूँ

git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached

यह उपयोग करता है -z तर्क ls-फ़ाइलें, और यह -0 तर्क xargs फ़ाइल नामों में "बुरा" पात्रों के लिए सुरक्षित / सही ढंग से पूरा करने के लिए।

मैनुअल पेज में Git-ls-फ़ाइलें (1), य़ह कहता है:

जब -z विकल्प का उपयोग नहीं किया जाता है, तो टैब, एलएफ, और बैकस्लैश वर्ण   पथनाम क्रमशः \ t, \ n, और \\ के रूप में दर्शाए जाते हैं।

तो मुझे लगता है कि अगर फ़ाइल नामों में इनमें से कोई भी पात्र है तो मेरे समाधान की आवश्यकता है।

संपादित करें: मुझे यह जोड़ने के लिए कहा गया है --- किसी की तरह git rm आदेश --- यह एक के बाद किया जाना चाहिए प्रतिबद्ध निष्कासन स्थायी बनाने के लिए, उदा। git commit -am "Remove ignored files"


37
2017-12-29 12:50



मेरे लिए यह सबसे अच्छा समाधान है। यह एक से बेहतर प्रदर्शन है git add .। इसमें उपरोक्त कुछ टिप्पणियों में भी सर्वोत्तम सुधार शामिल हैं। - Nils-o-mat
महान समाधान और बहुत अच्छी तरह से काम करता है - smac89
नामों में सही जगहों पर व्हाइटस्पेस वाली एक हटाई गई फ़ाइलों को हटाया गया। - Dave Walker
क्या आप thSoft जोड़ सकते हैं git commit -am "Remove ignored files" बाद में आपके उत्तर में? आपके उत्तरों ने मुझे चीजों के माध्यम से मिला: जे - kando


मैंने इसका उपयोग करके पूरा किया गिट फ़िल्टर-शाखा। मेरे द्वारा उपयोग किए जाने वाले सटीक आदेश को मैन पेज से लिया गया था:

चेतावनी: यह आपके पूरे इतिहास से फ़ाइल को हटा देगा

git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD

यह आदेश पूरे प्रतिबद्धता इतिहास को फिर से बनाएगा, निष्पादित करेगा git rm प्रत्येक प्रतिबद्धता से पहले और इसलिए निर्दिष्ट फ़ाइल से छुटकारा पा जाएगा। कमांड चलाने से पहले इसे वापस करने के लिए मत भूलना मर्जी खो जाओ।


34
2017-08-13 19:35



यह सभी प्रतिबद्ध आईडी बदल देगा, इस प्रकार भंडार की आपकी प्रति के बाहर शाखाओं से विलय तोड़ देगा। - bdonlan
चेतावनी: यह आपके पूरे इतिहास से फ़ाइल को हटा देगा। यह वही था जो मैं खोज रहा था, एक पूरी तरह से अनावश्यक और oversized फ़ाइल को हटाने के लिए (आउटपुट जो कभी नहीं किया जाना चाहिए) जो संस्करण इतिहास में बहुत समय पहले किया गया था। - zebediah49


इसका उपयोग करें जब:

1. आप कई फाइलों को अनैकैक करना चाहते हैं, या

2. आपने अपनी गिटिनोर फ़ाइल अपडेट की है

स्रोत लिंक:  http://www.codeblocq.com/2016/01/Untrack-files-already-added-to-git-repository-based-on-gitignore/

आइए मान लें कि आपने अपने गिट रिपोजिटरी में कुछ फाइलें पहले ही जोड़ दी हैं / प्रतिबद्ध हैं और फिर आप उन्हें अपने .gitignore में जोड़ दें; ये फ़ाइलें अभी भी आपके भंडार सूचकांक में मौजूद होंगी। यह आलेख हम देखेंगे कि उन्हें कैसे छुटकारा पाना है।

चरण 1: अपने सभी परिवर्तनों को प्रतिबद्ध करें

आगे बढ़ने से पहले, सुनिश्चित करें कि आपके सभी परिवर्तन प्रतिबद्ध हैं, जिसमें आपकी .gitignore फ़ाइल शामिल है।

चरण 2: भंडार से सब कुछ हटा दें

अपने रेपो को साफ़ करने के लिए, इसका उपयोग करें:

git rm -r --cached .
  • rm हटा आदेश है
  • -r रिकर्सिव हटाने की अनुमति देगा
  • -cached केवल सूचकांक से फ़ाइलों को हटा देगा। आपकी फाइलें अभी भी वहां होंगी।

rm आदेश क्षमाशील हो सकता है। यदि आप पहले से क्या करने की कोशिश करना चाहते हैं, तो जोड़ें -n या --dry-run चीज़ों का परीक्षण करने के लिए ध्वज।

चरण 3: सब कुछ जोड़ें

git add .

चरण 4: प्रतिबद्धता

git commit -m ".gitignore fix"

आपका भंडार साफ है :)

वहां पर प्रभावी परिवर्तनों को देखने के लिए अपने रिमोट में बदलावों को भी दबाएं।


22
2018-04-22 18:11