उन्हें .gitignore में जोड़ने के बाद दूरस्थ रिपॉजिटरी से निर्देशिका निकालें


597

मैंने प्रतिबद्ध किया और कुछ निर्देशिका को जीथब पर धकेल दिया। उसके बाद, मैंने .gitignoreएक निर्देशिका को जोड़ने वाली फ़ाइल को बदल दिया जिसे अनदेखा किया जाना चाहिए। सब कुछ ठीक काम करता है, लेकिन (अब अनदेखा) निर्देशिका जीथब पर रहती है।

मैं उस निर्देशिका को जीथब और रिपॉजिटरी हिस्ट्री से कैसे हटाऊं?


जवाबों:


1064

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

git rm -r --cached some-directory
git commit -m 'Remove the now ignored directory "some-directory"'
git push origin master

आप अपने रिपॉजिटरी के इतिहास को फिर से लिखे बिना अपने इतिहास से फ़ाइल को हटा नहीं सकते हैं - आपको ऐसा नहीं करना चाहिए अगर कोई और आपके रिपॉजिटरी के साथ काम कर रहा है, या आप इसे कई कंप्यूटरों से उपयोग कर रहे हैं। यदि आप अभी भी ऐसा करना चाहते हैं, तो आप git filter-branchइतिहास को फिर से लिखने के लिए उपयोग कर सकते हैं - यहाँ एक उपयोगी मार्गदर्शिका है

इसके अतिरिक्त, नोट से आउटपुट git rm -r --cached some-directoryकुछ इस तरह होगा:

rm 'some-directory/product/cache/1/small_image/130x130/small_image.jpg'
rm 'some-directory/product/cache/1/small_image/135x/small_image.jpg'
rm 'some-directory/.htaccess'
rm 'some-directory/logo.jpg'

rmभंडार के बारे में Git से प्रतिक्रिया है; फ़ाइलें अभी भी कार्यशील निर्देशिका में हैं।


3
यदि कोई और खींचता है, तो क्या अब नजरअंदाज की गई फाइलें उनके लिए हटा दी जाएंगी या अछूती रहेंगी?
मार्टिन कोनिसक

3
@ मर्टिन कोंसेक: यदि उपयोगकर्ता उन परिवर्तनों को खींच रहा है, तो उन फ़ाइलों में कोई संशोधन नहीं है, तो उन्हें हटा दिया जाएगा।
मार्क लोंगेयर

@MarkLongair क्या करता है -rऔर --cached। धन्यवाद।
लैबनानो

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

2
यह अच्छा काम करता है, लेकिन मुझे पहले करना था: git reset name_of_fileकाम करने के लिए ऊपर वर्णित क्या है
एड्वर्ड हॉगलैंड

248

मैं यह करता हूँ:

git rm --cached `git ls-files -i --exclude-from=.gitignore` 
git commit -m 'Removed all files that are in the .gitignore' 
git push origin master

जो आपके जिट इग्निशन में मौजूद सभी फाइलों / फ़ोल्डरों को हटा देगा, जिससे आपको हर एक को मैनुअली चुनना होगा


ऐसा लगता है कि मेरे लिए काम करना बंद कर दिया है, अब मैं करता हूं:

 git rm -r --cached . 
 git add .
 git commit -m 'Removed all files that are in the .gitignore' 
 git push origin master

4
धन्यवाद, इससे मुझे बहुत मदद मिली! यदि आप विंडोज़ पावरशेल का उपयोग कर रहे हैं, तो आप कर सकते हैंforeach ($i in iex 'git ls-files -i --exclude-from=.gitignore') { git rm --cached $i }
मैथ्यू

10
अपने दूसरे दृष्टिकोण की कोशिश की, इसने मेरे स्थानीय गिट से सभी फाइलें हटा दीं!
आर्टनिकप्रो

2
मुझे लगता है कि आप उपनिर्देशिका में नेविगेट करने और इसे करने वाले हैं। यदि मैं गलत हूं तो मुझे सही करों।

तो आज हमने क्या सीखा, बच्चे? "स्टैक ओवरफ्लो पर आपको मिलने वाला यादृच्छिक कोड न चलाएं!"
जोनाथन लैंड्रम

49

यहाँ मेरे उत्तर के अनुसार: कैसे एक रिपॉजिटरी से निर्देशिका को हटाने के लिए?

केवल फ़ोल्डर रिपॉजिटरी से फोल्डर / डायरेक्टरी को हटाने के लिए और लोकल ट्राई 3 सरल चरणों से नहीं।


निर्देशिका को हटाने के लिए कदम

git rm -r --cached FolderName
git commit -m "Removed folder from repository"
git push origin master

अगले फ़ोल्डर में उस फ़ोल्डर को अनदेखा करने के लिए कदम

अगले कमिट से उस फोल्डर को अनदेखा करने के लिए .itignore नाम की एक फाइल रूट करें और उस फोल्डर का नाम उसमें डालें। आप जितना चाहे उतना डाल सकते हैं

.gitignore फ़ाइल इस तरह दिखाई देगी

/FolderName

निर्देशिका निकालें


1
यही वह है जिसकी तलाश में मैं हूं। धन्यवाद :)
रोहित सिंह

मुझे खुशी है कि इसने @Rohit Singh
eirenaios

9

ब्लंडेल का पहला जवाब मेरे लिए काम नहीं करता था। हालांकि इसने मुझे सही रास्ता दिखाया। मैंने ऐसा ही किया है:

> for i in `git ls-files -i --exclude-from=.gitignore`; do git rm --cached $i; done
> git commit -m 'Removed all files that are in the .gitignore'
> git push origin master

मैं आपको सलाह देता हूं कि नीचे दिए गए स्टेटमेंट को चलाकर सबसे पहले डिलीट की जाने वाली फाइलों की जांच करें:

git ls-files -i --exclude-from=.gitignore

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


5

नोट: यह समाधान केवल Github डेस्कटॉप GUI के साथ काम करता है ।

Github Desktop GUI का उपयोग करके यह बहुत सरल है।

  1. फ़ोल्डर को किसी अन्य स्थान पर (प्रोजेक्ट फ़ोल्डर से बाहर) अस्थायी रूप से स्थानांतरित करें।

  2. अपनी .gitignoreफ़ाइल को संपादित करें और फ़ोल्डर प्रविष्टि को हटा दें जो गिटबुक पेज पर मास्टर रिपॉजिटरी को हटा देगा।

  3. प्रोजेक्ट फ़ोल्डर को कमिट और सिंक करें।

  4. फ़ोल्डर को प्रोजेक्ट फ़ोल्डर में फिर से ले जाएँ

  5. .gitignoreफ़ाइल को पुनः संपादित करें ।

बस इतना ही।


5

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

git ls-files -i --exclude-from=.gitignore > to_remove.txt
while read line; do `git rm -r --cached "$line"`; done < to_remove.txt
rm to_remove.txt
git commit -m 'Removed all files that are in the .gitignore' 
git push origin master

4

यह विधि मानक .gitignore व्यवहार को लागू करती है, और मैन्युअल रूप से उन फ़ाइलों को निर्दिष्ट करने की आवश्यकता नहीं होती है जिन्हें अनदेखा करने की आवश्यकता होती है

--exclude-from=.gitignoreअब और उपयोग नहीं कर सकते : / - यहाँ अद्यतन विधि है:

सामान्य सलाह: एक साफ रेपो के साथ शुरू करें - सब कुछ प्रतिबद्ध, कार्यशील निर्देशिका या सूचकांक में लंबित कुछ भी नहीं, और एक बैकअप बनाएं !

#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

#optionally add anything to the index that was previously ignored but now shouldn't be:
git add *

#commit again
#optionally use the --amend flag to merge this commit with the previous one instead of creating 2 commits.

git commit -m "re-applied modified .gitignore"

#other devs who pull after this commit is pushed will see the  newly-.gitignored files DELETED

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


0

यदि आप PowerShell से काम कर रहे हैं, तो एकल कमांड के रूप में निम्न प्रयास करें।

PS MyRepo> git filter-branch --force --index-filter
>> "git rm --cached --ignore-unmatch -r .\\\path\\\to\\\directory"
>> --prune-empty --tag-name-filter cat -- --all

फिर, git push --force --all

प्रलेखन: https://git-scm.com/docs/git-filter-branch


कैसे उपयोग करने से git filter-branchअलग है git rm? मैं मूल रूप से सोच रहा था कि मुझे एक संस्करण का उपयोग करना है, git filter-branchलेकिन यहां अधिकांश टिप्पणियां उपयोग करने की सलाह देती हैं git rm। जो कुछ मैं समझता हूं git rmवह केवल इसे वर्तमान कार्य निर्देशिका और सूचकांक से हटा देता है। लेकिन अगर इसके अतिरिक्त कई जोड़े गए, तो यह अभी भी भंडार में रहेगा।
अल्फा_ 989

सही। git rmभविष्य में नवीनतम कमेटी से फाइल को हटा देगा। git filter-branchहमें इसे पूरे इतिहास से हटाने की अनुमति देता है। इसे भी देखें: help.github.com/articles/…
शॉन लुटिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.