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




10 Answers

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

प्रथम:

git rm -r --cached . 
git add .

फिर:

git commit -am "Remove ignored files"
git gitignore git-rm

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

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




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

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




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




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

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

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"

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

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




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

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

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

ये 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 साथ समस्याएं अनुपस्थित होंगी। यह समाधान कॉन्फ़िगरेशन फ़ाइलों के लिए ठीक है, जब प्रत्येक डेवलपर की अपनी प्रोजेक्ट कॉन्फ़िगरेशन होती है।

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




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

# 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 .



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




यह अब नवीनतम गिट (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



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

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




Related