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





(17)


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

# Get files matching exclusionsfrom .gitignore
# Excluding comments and empty lines
$ignoreFiles =  gc .gitignore | ?{$_ -notmatch  "#"} |  ?{$_ -match  "\S"} | % {
                    $ignore = "*" + $_ + "*"
                    (gci -r -i $ignore).FullName
                }
$ignoreFiles = $ignoreFiles| ?{$_ -match  "\S"}

# Remove each of these file from Git 
$ignoreFiles | % { git rm $_}

git add .

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

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




यदि आप 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 से चेकआउट के रूप में साफ़ करें। यह मुश्किल चीजें है, मैं नौसिखिया उपयोगकर्ता के लिए इसकी अनुशंसा नहीं करता हूं।
  • कॉन्फ़िगरेशन फ़ाइल को उस पर तैनात एक तैनाती शाखा पर रखें जो मास्टर को कभी विलय नहीं किया जाता है। जब आप तैनाती / संकलन / परीक्षण करना चाहते हैं तो आप उस शाखा में विलय करें और उस फ़ाइल को प्राप्त करें। मानव मर्ज नीतियों और अतिरिक्त गिट मॉड्यूल का उपयोग करने के अलावा यह अनिवार्य रूप से धुंध / साफ दृष्टिकोण है।
  • विरोधी पुनर्मूल्यांकन: आचरण-अपरिवर्तित का उपयोग न करें, यह केवल आँसू में समाप्त होगा।



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

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




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

गिट कॉन्फ़िगरेशन --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 और फ़ाइलों को आपने अभी हटा दिया है
  • प्रतिबद्ध



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

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"

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

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




यह अब नवीनतम गिट (v2.17.1 लिखने के समय) में कोई मुद्दा नहीं है

अंततः .gitignore ट्रैक-लेकिन-हटाए गए फ़ाइलों को अनदेखा करता है। आप निम्न स्क्रिप्ट चलाकर अपने लिए इसका परीक्षण कर सकते हैं। अंतिम git status स्टेटमेंट को "प्रतिबद्ध करने के लिए कुछ नहीं" रिपोर्ट करनी चाहिए।

# Create empty repo
mkdir gitignore-test
cd gitignore-test
git init

# Create a file and commit it
echo "hello" > file
git add file
git commit -m initial

# Add the file to gitignore and commit
echo "file" > .gitignore
git add .gitignore
git commit -m gitignore

# Remove the file and commit
git rm file
git commit -m "removed file"

# Reintroduce the file and check status.
# .gitignore is now respected - status reports "nothing to commit".
echo "hello" > file
git status



मुझे लगता है कि शायद गिट पूरी तरह से फाइल के बारे में भूल नहीं सकता क्योंकि इसकी गर्भधारण ( खंड "स्नैपशॉट्स, मतभेद नहीं" )।

यह समस्या अनुपस्थित है, उदाहरण के लिए, सीवीएस का उपयोग करते समय। सीवीएस फाइल-आधारित परिवर्तनों की सूची के रूप में जानकारी संग्रहीत करता है। सीवीएस के लिए जानकारी फाइलों का एक सेट है और समय के साथ प्रत्येक फाइल में किए गए परिवर्तन।

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

ये 2 लेख मेरे लिए सहायक थे:

गिट मानें-अपरिवर्तित बनाम स्किप-वर्कट्री और गिट के साथ ट्रैक की गई फ़ाइलों में परिवर्तनों को अनदेखा कैसे करें

इस पर निर्भर करते हुए मैं निम्नलिखित करता हूं, अगर फ़ाइल पहले ही ट्रैक हो चुकी है:

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

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

git update-index --no-skip-worktree <file>
git stash
git pull 

फ़ाइल सामग्री को दूरस्थ सामग्री द्वारा प्रतिस्थापित किया जाएगा। सुरक्षित स्थान से फ़ाइल में अपने परिवर्तन पेस्ट करें और फिर से प्रदर्शन करें:

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

यदि प्रोजेक्ट के साथ काम करने वाले हर कोई git update-index --skip-worktree <file> , तो pull साथ समस्याएं अनुपस्थित होंगी। यह समाधान कॉन्फ़िगरेशन फ़ाइलों के लिए ठीक है, जब प्रत्येक डेवलपर की अपनी प्रोजेक्ट कॉन्फ़िगरेशन होती है।

यह हर बार ऐसा करने के लिए बहुत सुविधाजनक नहीं है, जब रिमोट पर फ़ाइल बदल दी गई है, लेकिन इसे रिमोट कंटेंट द्वारा अधिलेखित करने से बचा सकता है।




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

(लिनक्स के तहत), मैं यहां पोस्ट्स का उपयोग करना चाहता था 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



पहले ही प्रतिबद्ध होने के मामले में 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 rm -r --cached . 
git add .

फिर:

git commit -am "Remove ignored files"



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




  1. अपनी .gitignore फ़ाइल को अपडेट करें - उदाहरण के लिए, एक फ़ोल्डर जोड़ें जिसे आप ट्रैक नहीं करना चाहते हैं .gitignore

  2. git rm -r --cached . - वांछित और अवांछित सहित सभी ट्रैक की गई फ़ाइलों को हटा दें। जब तक आप स्थानीय रूप से सहेजे गए हैं तब तक आपका कोड सुरक्षित रहेगा।

  3. git add . - .gitignore में उन सभी को छोड़कर, सभी फ़ाइलों को वापस जोड़ा जाएगा।

सही दिशा में हमें इंगित करने के लिए हैट टिप @ अकिरायामामोतो।




BFG विशेष रूप से गिट रेपो से बड़ी फ़ाइलों या पासवर्ड जैसे अवांछित डेटा को हटाने के लिए डिज़ाइन किया गया है, इसलिए इसमें एक साधारण ध्वज है जो किसी भी बड़े ऐतिहासिक (इन-इन-द-वर्तमान-प्रतिबद्ध) फ़ाइलों को हटा देगा: '- स्ट्रिप-ब्लब्स- से भी बड़ा'

$ java -jar bfg.jar --strip-blobs-bigger-than 100M

यदि आप नाम से फाइल निर्दिष्ट करना चाहते हैं, तो आप यह भी कर सकते हैं:

$ java -jar bfg.jar --delete-files *.mp4

बीएफजी गिट फिल्टर-शाखा से 10-1000x तेज है, और आम तौर पर उपयोग करने में बहुत आसान है - अधिक जानकारी के लिए पूर्ण उपयोग निर्देशों और examples जांच करें।

स्रोत: https://confluence.atlassian.com/bitbucket/reduce-repository-size-321848262.html




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

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

git rm --cached <file>

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




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




शाखाएं हटाना

आइए मान लें कि शाखा "संपर्क-फ़ॉर्म" पर हमारा काम किया गया है और हमने इसे पहले ही "मास्टर" में एकीकृत कर लिया है। चूंकि हमें इसकी आवश्यकता नहीं है, इसलिए हम इसे हटा सकते हैं (स्थानीय रूप से):

$ git branch -d contact-form

और रिमोट शाखा को हटाने के लिए:

git push origin --delete contact-form




git gitignore git-rm