स्वीकृत उत्तर किसी फ़ाइल के बारे में " गिट " को "भूल" नहीं करता है ... "(ऐतिहासिक रूप से)। यह केवल गिट की अनदेखी करता है वर्तमान / भविष्य में फ़ाइल की करता है।
यह विधि पूरी तरह से उपेक्षित फ़ाइलों ( भूत / वर्तमान / भविष्य) को भूल जाती है , लेकिन ऐसा नहीं करती है कार्यशील निर्देशिका (भले ही रिमोट से दोबारा खींची गई) से कुछ भी हटाती है।
इस विधि के उपयोग की आवश्यकता है /.git/info/exclude
(पसंदीदा) या एक पूर्व मौजूदा .gitignore
में सब करता है कि फ़ाइलों को नजरअंदाज किया जा करने के लिए / भूल। 1
प्रभावी रूप से इतिहास को प्रभावी रूप से फिर से लिखने के बाद git को लागू करने के सभी तरीकों में उपेक्षा होती है और इस तरह किसी भी सार्वजनिक / साझा / सहयोगी प्रतिनिधि के लिए महत्वपूर्ण प्रभाव पड़ता है जिसे इस प्रक्रिया के बाद खींचा जा सकता है। 2
सामान्य सलाह: एक साफ रेपो के साथ शुरू करें - सब कुछ प्रतिबद्ध, कार्यशील निर्देशिका या सूचकांक में लंबित कुछ भी नहीं, और एक बैकअप बनाएं !
इसके अलावा, टिप्पणी / संशोधन इतिहास के इस जवाब ( और संशोधन इतिहास के इस सवाल का ) ज्ञानवर्धक / उपयोगी हो सकता है।
#commit up-to-date .gitignore (if not already existing)
#this command must be run on each branch
git add .gitignore
git commit -m "Create .gitignore"
#apply standard git ignore behavior only to current index, not working directory (--cached)
#if this command returns nothing, ensure /.git/info/exclude AND/OR .gitignore exist
#this command must be run on each branch
git ls-files -z --ignored --exclude-standard | xargs -0 git rm --cached
#Commit to prevent working directory data loss!
#this commit will be automatically deleted by the --prune-empty flag in the following command
#this command must be run on each branch
git commit -m "ignored index"
#Apply standard git ignore behavior RETROACTIVELY to all commits from all branches (--all)
#This step WILL delete ignored files from working directory UNLESS they have been dereferenced from the index by the commit above
#This step will also delete any "empty" commits. If deliberate "empty" commits should be kept, remove --prune-empty and instead run git reset HEAD^ immediately after this command
git filter-branch --tree-filter 'git ls-files -z --ignored --exclude-standard | xargs -0 git rm -f --ignore-unmatch' --prune-empty --tag-name-filter cat -- --all
#List all still-existing files that are now ignored properly
#if this command returns nothing, it's time to restore from backup and start over
#this command must be run on each branch
git ls-files --other --ignored --exclude-standard
अंत में, इस गीथहब गाइड (चरण 6 पर शुरू) के बाकी हिस्सों का पालन करें जिसमें नीचे दिए गए आदेशों के बारे में महत्वपूर्ण चेतावनी / जानकारी शामिल है ।
git push origin --force --all
git push origin --force --tags
git for-each-ref --format="delete %(refname)" refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now
अन्य देवता जो अब संशोधित रिमोट रेपो से खींचते हैं, उन्हें एक बैकअप बनाना चाहिए और फिर:
#fetch modified remote
git fetch --all
#"Pull" changes WITHOUT deleting newly-ignored files from working directory
#This will overwrite local tracked files with remote - ensure any local modifications are backed-up/stashed
git reset FETCH_HEAD
फुटनोट
1 क्योंकि /.git/info/exclude
उपरोक्त निर्देशों का उपयोग करके सभी ऐतिहासिक कमिटों पर लागू किया जा सकता है, शायद ऐतिहासिक कमिट (एस) में एक .gitignore
फ़ाइल प्राप्त करने के बारे में विवरण जो इसकी आवश्यकता है वह इस उत्तर के दायरे से परे है। मैं रूट कमिटमेंट में होना चाहता था , जैसे कि यह पहली चीज थी। दूसरों की परवाह नहीं कर सकते हैं के बाद से एक ही बात पर ध्यान दिए बिना जहां पूरा कर सकते हैं के लिए प्रतिबद्ध इतिहास में मौजूद है, और स्पष्ट रूप से फिर से लिखकर इतिहास एक है बहुत भावुक विषय, तब भी जब के बारे में पता असर.gitignore
/.git/info/exclude
.gitignore
।
FWIW, संभावित तरीकों में शामिल हो सकता है git rebase
या जो प्रत्येक बाहरी को इस प्रश्न के उत्तर की तरह git filter-branch
कॉपी करता है .gitignore
2 एक स्टैंडअलोन git rm --cached
कमांड के परिणामों को लागू करने के बाद व्यवहार को नजरअंदाज करने वाले व्यवहार को लागू करना भविष्य में बल-धकेलने वाले रिमोट से नई-उपेक्षित फ़ाइल को हटाने में परिणाम हो सकता है । --prune-empty
निम्नलिखित में झंडा git filter-branch
आदेश स्वचालित रूप से हटाने के पिछले "सब पर ध्यान नहीं दिया फ़ाइलों को हटाने" अनुक्रमणिका-केवल प्रतिबद्ध करके इस समस्या से बचा जाता है। रीट राइटिंग गिट हिस्ट्री भी कमिट हैश को बदल देती है, जो पब्लिक / शेयर्ड / कोऑपरेटिव रिपोज से भविष्य में आने वाले कहर पर कहर बरपाएगा। कृपया समझें असर पूरी तरह से इस तरह के एक रेपो को ऐसा करने से पहले। यह GitHub गाइड निम्नलिखित निर्दिष्ट करता है:
अपने सहयोगियों को रिबेज करने के लिए कहें , मर्ज न करें , किसी भी शाखा को उन्होंने आपके पुराने (दागी) भंडार इतिहास से दूर कर दिया। एक मर्ज कमिटमेंट कुछ या सभी दागी इतिहास को फिर से प्रस्तुत कर सकता है जिसे आप सिर्फ शुद्ध करने की परेशानी में गए थे।
वैकल्पिक समाधान जो दूरस्थ रेपो को प्रभावित नहीं करते हैं git update-index --assume-unchanged </path/file>
या git update-index --skip-worktree <file>
, जिनके उदाहरण यहां मिल सकते हैं ।
git clean -X
समान लगता है, लेकिन यह इस स्थिति में लागू नहीं होता है (जब फाइलें अभी भी गिट द्वारा ट्रैक की जा रही हैं)। मैं गलत रास्ता का पालन नहीं करने के लिए एक समाधान की तलाश में किसी के लिए यह लिख रहा हूँ।