नई .gitignore फ़ाइल के साथ Resync git रेपो


191

क्या gitignore फाइल को अपडेट करने के बाद git रिपॉजिटरी को "रिफ्रेश" करना संभव है?

मैंने अभी-अभी अपने gitignore में और अधिक अज्ञानता (?) जोड़ी है और नई फाइल से मेल खाते रेपो में पहले से ही सामान को हटाना चाहूंगा।


1
क्या यह stackoverflow.com/questions/1139762/gitignore-file-not-ignoring के समान नहीं है ?
वॉन

हो सकता है, कि समाधान पहले से ही नए gitignore से मेल खाती फ़ाइलों को हटा दें?
क्रिश्चियन Wattengård

99
"उपेक्षा" शब्द का आविष्कार करने के लिए +1।
अनसमुंड एल्डहुसेट

3
en.wiktionary.org/wiki/ignoration @AasmundEldhuset यह आधिकारिक है
डैनियल स्प्रिंगर

1
@ user770: आज मैंने सीखा!
अनसमुंड एल्डहुसेट

जवाबों:


370

" .Ignignore फ़ाइल को अनदेखा नहीं करना " में वर्णित समाधान थोड़ा चरम है, लेकिन काम करना चाहिए:

# rm all files
git rm -r --cached .
# add all files as per new .gitignore
git add .
# now, commit for new .gitignore to apply
git commit -m ".gitignore is now working"

( अपने परिवर्तनों को आप रखना चाहते हैं पहले प्रतिबद्ध करने के लिए सुनिश्चित करें के रूप में किसी भी घटना से बचने के लिए, jball037 टिप्पणी नीचे । विकल्प अपनी फ़ाइलें आपके डिस्क हालांकि पर अछूता रखना होगा।)
--cached

आपके पास ब्लॉग पोस्ट में " पहले से ट्रैक की गई फाइलों को नजरअंदाज कर देना " के अलावा और भी बेहतरीन समाधान हैं :

git rm --cached `git ls-files -i --exclude-standard`

बसीम ने अपने संपादन में सुझाव दिया :

उनके रास्तों में जगह के साथ फाइलें

यदि आपको कोई त्रुटि संदेश मिलता है fatal: path spec '...' did not match any files, जैसे कि उनके पथ में रिक्त स्थान वाली फ़ाइलें हो सकती हैं।

आप विकल्प के साथ अन्य सभी फाइलें हटा सकते हैं --ignore-unmatch:

git rm --cached --ignore-unmatch `git ls-files -i --exclude-standard`

लेकिन बेजोड़ फाइलें आपकी रिपॉजिटरी में रहेंगी और उन्हें दोहरे उद्धरण चिह्नों के साथ अपना रास्ता स्पष्ट करके हटा दिया जाएगा:

git rm --cached "<path.to.remaining.file>"

मैंने पाया है कि git ऐड स्टेप अनावश्यक है, जब मैं git rm - cached के बाद git स्टेटस चलाता हूं, हटाए गए फाइल्स पहले से ही स्टेजिंग एरिया में होते हैं और आप बस आगे जाकर उन्हें कमिट कर सकते हैं।
चप

3
मैंने बस इसे चलाया, मेरे सभी uncommitted परिवर्तन खो दिए, और लगभग मेरी नौकरी से इस्तीफे की घोषणा की। इस सूत्र पर स्वीकृत उत्तर ने मेरा जीवन बचाया: stackoverflow.com/questions/2125710/how-to-revert-a-git-rm-r
jball037

2
@VonC क्षमा करें, यह एक शेख़ी या छड़ी का मतलब नहीं था :) लेकिन हाँ, मैंने इस्तेमाल किया - कैश्ड और मेरे सभी अनकम्यूटेड परिवर्तन तब खो गए जब मैंने अपनी फ़ाइलों की जाँच की। एक पल के लिए घबराए लेकिन "git reset HEAD" ने मेरी फाइलों को पुनर्स्थापित किया (लेकिन इस बार बिना फाइलों के जो मैंने निर्दिष्ट किया है।
initignore

3
@ jball037 अच्छा। मैंने चेतावनी जोड़ दी है और तदनुसार उत्तर संपादित किया है।
वॉन

1
अगर केवल ऐसा करने से पहले मैं एक पंक्ति आगे पढ़ता हूं "(किसी भी घटना को jball037 के रूप में टालने के लिए पहले अपने बदलावों को सुनिश्चित करना सुनिश्चित करें" #fml
Aiden Strydom

9

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

यदि आप पहले से शुरू की गई अनदेखा फ़ाइलों को हटाना चाहते हैं, तो उपयोग करें

git rm –cached `git ls-files -i –exclude-standard`
git commit -m 'clean up'

यहाँ एकल-उद्धरण के साथ क्या है?
इगोरगानापोलस्की जू

यह एक महान जवाब है
Holene

यह एक बहुत ही सरल तरीका है, क्योंकि मैं अपना अपडेट अपडेट करने के बाद फाइलें निकाल देता हूं। हालांकि इसे कुछ मामूली अपडेट की जरूरत है: `` git rm –cached git ls-files -i –exclude-standard git कमिट -m 'क्लीन अप ``
हारून

1

मुझे पता है कि यह एक पुराना सवाल है, लेकिन अगर फ़ाइल के नाम में रिक्त स्थान हैं, तो ग्रेचस का समाधान काम नहीं करता है। रिक्त स्थान के साथ नाम दर्ज करने के लिए वॉनसी का समाधान उन्हें उपयोग करने से दूर नहीं करना है --ignore-unmatch, फिर उन्हें मैन्युअल रूप से हटा दें, लेकिन बहुत कुछ होने पर यह अच्छी तरह से काम नहीं करेगा।

यहां एक समाधान है जो सभी फ़ाइलों को कैप्चर करने के लिए बैश सरणियों का उपयोग करता है।

# Build bash array of the file names
while read -r file; do 
    rmlist+=( "$file" )
done < <(git ls-files -i --exclude-standard)

git rm –-cached "${rmlist[@]}"

git commit -m 'ignore update'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.