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




git-rm (14)

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

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


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

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 हटा आदेश है
  • -आर रिकर्सिव हटाने की अनुमति देगा
  • -कैच केवल इंडेक्स से फ़ाइलों को हटा देगा। आपकी फाइलें अभी भी वहां होंगी।

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

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

git add .

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

git commit -m ".gitignore fix"

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

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


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

(लिनक्स के तहत), मैं यहां पोस्ट्स का उपयोग करना चाहता था ls-files --ignored --exclude-standard | xargs git rm -r --cached 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

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

मैनुअल पेज git-ls-files (1) में , यह बताता है:

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

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

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


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


निम्नलिखित चरणों को क्रमशः करें, आप ठीक होंगे।

1. निर्देशिका / भंडारण से गलती से जोड़े गए फ़ाइलों को हटा दें । आप "rm -r" (linux के लिए) कमांड का उपयोग कर सकते हैं या निर्देशिका ब्राउज़ करके उन्हें हटा सकते हैं।

2. फाइलों / निर्देशिकाओं को अब gitignore फ़ाइल में जोड़ें और इसे सेव करें।

3.now इन आदेशों का उपयोग करके उन्हें गिट कैश से हटा दें (यदि एक से अधिक निर्देशिकाएं हैं, तो इस आदेश को बार-बार जारी करके उन्हें एक-एक करके हटा दें)

git rm -r --cached path-to-those-files

4. अब एक प्रतिबद्धता और धक्का करो , इन आदेशों का उपयोग करें। यह उन फ़ाइलों को गिट रिमोट से हटा देगा और गिट स्टॉप को उन फ़ाइलों को ट्रैक कर देगा।

git add .
git commit -m "removed unnecessary files from git"
git push origin

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


मुझे जॉनब्रावे का जवाब पसंद आया लेकिन मेरे पास पर्याप्त काम करने वाली निर्देशिकाएं हैं जो मुझे प्रतिबद्ध करती हैं- मुझे थोड़ा डराता है, इसलिए मैंने जो किया है:

गिट कॉन्फ़िगरेशन --global alias.exclude-ignored '! git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached && git ls-files -z --ignored --exclude-standard | xargs -0 गिट स्टेज और गिट स्टेज .gitignore && git commit -m "नया गिटिग्नोर और इंडेक्स से अनदेखा फाइलों को हटाएं"

इसे तोड़ना:

git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached 
git ls-files -z --ignored --exclude-standard | xargs -0 git stage 
git stage .gitignore 
git commit -m "new gitignore and remove ignored files from index"
  • इंडेक्स से अनदेखा फाइलों को हटा दें
  • चरण। gitignore और फ़ाइलों को आपने अभी हटा दिया है
  • प्रतिबद्ध

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

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

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


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

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

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

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


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

संक्षेप में:

  • क्या आपका एप्लिकेशन एक अनदेखा फ़ाइल config-overide.ini के लिए देखो और प्रतिबद्ध फ़ाइल config.ini (या वैकल्पिक रूप से, ~ / .config / myapp.ini, या $ MYCONFIGFILE के लिए देखें) पर इसका उपयोग करें।
  • फ़ाइल कॉन्फ़िगरेशन-sample.ini को कम करें और फ़ाइल config.ini को अनदेखा करें, यदि आवश्यक हो तो एक स्क्रिप्ट या फ़ाइल को आवश्यकतानुसार कॉपी करें।
  • आवेदनों को लागू करने और हटाने के लिए gitattributes को साफ / धुंधला जादू का उपयोग करने का प्रयास करें, उदाहरण के लिए कॉन्फ़िगरेशन फ़ाइल को वैकल्पिक शाखा से चेकआउट के रूप में धुंधला करें और कॉन्फ़िगरेशन फ़ाइल को HEAD से चेकआउट के रूप में साफ़ करें। यह मुश्किल चीजें है, मैं नौसिखिया उपयोगकर्ता के लिए इसकी अनुशंसा नहीं करता हूं।
  • कॉन्फ़िगरेशन फ़ाइल को उस पर तैनात एक तैनाती शाखा पर रखें जो मास्टर को कभी विलय नहीं किया जाता है। जब आप तैनाती / संकलन / परीक्षण करना चाहते हैं तो आप उस शाखा में विलय करें और उस फ़ाइल को प्राप्त करें। मानव मर्ज नीतियों और अतिरिक्त गिट मॉड्यूल का उपयोग करने के अलावा यह अनिवार्य रूप से धुंध / साफ दृष्टिकोण है।
  • विरोधी पुनर्मूल्यांकन: आचरण-अपरिवर्तित का उपयोग न करें, यह केवल आँसू में समाप्त होगा।

यदि आप सीएलआई का उपयोग नहीं करना चाहते हैं और विंडोज पर काम कर रहे हैं, तो टोर्टोइज गिट का उपयोग करना एक बहुत ही सरल समाधान है, इसमें मेनू में "हटाएं (स्थानीय रखें)" क्रिया है जो ठीक काम करता है।


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

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

git rm --cached <file>

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


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

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

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

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


पहले ही प्रतिबद्ध होने के मामले में DS_Store:

find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch

उन्हें अनदेखा करें:

echo ".DS_Store" >> ~/.gitignore_global
echo "._.DS_Store" >> ~/.gitignore_global
echo "**/.DS_Store" >> ~/.gitignore_global
echo "**/._.DS_Store" >> ~/.gitignore_global
git config --global core.excludesfile ~/.gitignore_global

अंत में, प्रतिबद्ध करो!


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

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






git-rm