उन फ़ाइलों को निकालने के लिए कैसे करें जो .gitignore में सूचीबद्ध हैं लेकिन फिर भी रिपॉजिटरी पर हैं?


327

मेरी रिपॉजिटरी में कुछ फाइलें हैं जिन्हें नजरअंदाज किया जाना चाहिए, मैंने उन्हें .itignore में जोड़ा लेकिन निश्चित रूप से, उन्हें मेरी रिपॉजिटरी से नहीं हटाया गया।

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



1
करने के लिए इसी तरह के stackoverflow.com/questions/1274057/...
परीक्षण


चेतावनी: हालांकि यह आपके स्थानीय से भौतिक फ़ाइल को नहीं निकालेगा, यह अगले डेवलपर्स पुल पर अन्य डेवलपर्स मशीनों से फ़ाइलों को हटा देगा। कैसे ट्रैक किया गया था जो एक फ़ाइल के बारे में "भूल" बनाने के लिए है, लेकिन अब .gitignore में है?
क्रिस रूफ

@Stevoisiak यह उस प्रश्न का डुप्लिकेट नहीं है क्योंकि यह कोई सभी अनदेखा फ़ाइलों के बारे में पूछता है और यह भी इसी तरह के किसी भी प्रश्न से बेहतर उत्तर है।
ओम जुएल

जवाबों:


438

आप उन्हें मैन्युअल रूप से भंडार से निकाल सकते हैं:

git rm --cached file1 file2 dir/file3

या, यदि आपके पास बहुत सारी फाइलें हैं:

git rm --cached `git ls-files -i --exclude-from=.gitignore`

लेकिन यह विंडोज पर गिट बैश में काम नहीं करता है। यह एक त्रुटि संदेश पैदा करता है। निम्नलिखित बेहतर काम करता है:

git ls-files -i --exclude-from=.gitignore | xargs git rm --cached  

इन फ़ाइलों के बिना पूरे इतिहास को फिर से लिखने के बारे में, मुझे बहुत संदेह है कि ऐसा करने का एक स्वचालित तरीका है।
और हम सभी जानते हैं कि इतिहास का पुनर्लेखन बुरा है, क्या हम नहीं? :)


2
दुर्भाग्य से विंडोज कमांड पर गिट बैश उन रास्तों के साथ काम नहीं करता है जिसमें रिक्त स्थान हैं
नैट बंडी

19
@Cupcake धन्यवाद। git ls-files -i -z --exclude-from=.gitignore | xargs -0 git rm --cachedचाल करने के लिए लगता है
नैट बंडी

3
मैं खिड़कियों पर एक ही समस्या के साथ फंस गया। मैं पावरशेल का उपयोग कर रहा हूं, और मेरे मामले में मुझे @ samy-dindane ने तीसरी कमांड दी है और इसे फ़ॉरच्यू में बदल दिया है। यह यह बन गयाgit ls-files -i --exclude-from=.gitignore | %{git rm --cached $_}
Digaomatias

1
"git ls-files -i --exclude-from = .ignignore" बहुत मददगार है, यह मुझे बताता है कि .ignore द्वारा कौन सी फाइलें बाहर रखी गई हैं।
ओवेन काओ

1
मैं इन आदेशों को पाकर खुश था, लेकिन यह वास्तव में भंडार से फाइलों को नहीं हटाता है। जब मैंने 2300 kB चित्र निकाले, तो रिपॉजिटरी का आकार केवल 10 kB गिरा। इसलिए इसका उपयोग नहीं किया जा सकता है, उदाहरण के लिए, भंडार को छोटा और तेजी से स्थानांतरित करने के लिए।
Jan Potužník

343

एक आसान तरीका है जो किसी भी ओएस पर काम करता है

git rm -r --cached .
git add .
git commit -m "Removing all files in .gitignore"

आपने मूल रूप से .gitignore को छोड़कर सभी फ़ाइलों को पढ़ा है


1
कैसे काम करता है इस आशय रेपो एक को क्रियान्वित करने पर अन्य उपयोगकर्ताओं पुल - के रूप में मैं यह फ़ोल्डर हम न अब और ट्रैक करने के लिए हटा दिया गया है चाहता हूँ पढ़ ??? हम इस रोका जा सकता है कैसे - हम सिर्फ करने के लिए untrack चाहते
snh_nl

यह सभी फाइलों को चिह्नित करेगा जैसा कि एक नकली प्रतिबद्ध संदेश के साथ बदल गया है!
हैदर ज़ीनेडाइन

3
नकली प्रतिबद्ध संदेश का क्या मतलब है? यह एक वास्तविक प्रतिबद्ध संदेश है: P आप अपनी ज़रूरतों के आधार पर पाठ्यक्रम का संदेश बदल सकते हैं ...
gtatr

1
बस एक संपूर्णता के लिए आपको अंत में git पुश कमांड की आवश्यकता है।
मार्सियस बालोब्रोज़्स्की

1
ऐसा मत करो, यह सभी फाइलों पर इतिहास को हटा देगा
एग्रैथ

144

जैसे कि .ignignore की फ़ाइलों को ट्रैक नहीं किया जा रहा है, आप git क्लीन कमांड का उपयोग उन फ़ाइलों को पुन: हटाने के लिए कर सकते हैं जो संस्करण नियंत्रण में नहीं हैं।

git clean -xdnशुष्क रन करने के लिए उपयोग करें और देखें कि क्या हटाया जाएगा।
फिर git clean -xdfइसे निष्पादित करने के लिए उपयोग करें।

मूल रूप से, git clean -hया man git-clean(यूनिक्स में) आपको मदद देगा।

ज्ञात हो कि यह कमांड उन नई फाइलों को भी हटा देगा , जो स्टेजिंग एरिया में नहीं हैं।

आशा है ये मदद करेगा।


6
यह स्वीकृत उत्तर होना चाहिए। यह वास्तव में काम करता है (स्वीकृत जवाब मेरे लिए काम नहीं किया, macOS पर), और यह एक तरह से क्लीनर है।
रोजर ओबा

25
इस उत्तर लागू नहीं है - ओ पी का कहना है फाइलों में .gitignore कर रहे हैं पता लगाया जा रहा।
केन विलियम्स

20
सावधान! यह स्थायी रूप से शाखा से हटाने के बजाय सभी अनट्रैक की गई फ़ाइलों को हटा देता है
इमैनुअल

1
git clean -xdnएक सूखी रन जो नहीं हटेंगे है। अगले एक होगा।
जॉनजैज

17
-1: यह एक अत्यधिक भ्रामक उत्तर है - मूल पोस्टर रिपॉजिटरी से हटाना चाहता था, फाइलों को पूरी तरह से नहीं हटाता था। मैं अपनी IDE द्वारा आवश्यक डायनेमिक फ़ाइलों का एक लोड हटाने के करीब था, लेकिन रेपो में होना आवश्यक नहीं था।
शुभ अंक

4

मैंने सिड के साथ .ignignore स्टेटमेंट के आउटपुट में हेरफेर करके एक बहुत ही सीधा समाधान किया:

cat .gitignore | sed '/^#.*/ d' | sed '/^\s*$/ d' | sed 's/^/git rm -r /' | bash

स्पष्टीकरण:

  1. .gitignore फ़ाइल प्रिंट करें
  2. प्रिंट से सभी टिप्पणियों को हटा दें
  3. सभी खाली लाइनों को हटा दें
  4. लाइन की शुरुआत में 'git rm -r' जोड़ें
  5. हर लाइन पर अमल करें।


0

लिनक्स में आप इस कमांड का उपयोग कर सकते हैं:

छूट के लिए मैं "* .py ~" हटाना चाहता हूं, इसलिए मेरा कमांड ==> होना चाहिए

find . -name "*.py~" -exec rm -f {} \;


-3

आपके द्वारा .ITignignore में जोड़ने के बाद git मेल की गई .gitignore पैटर्न की फ़ाइलों को अनदेखा कर देगा।

लेकिन भंडार में पहले से मौजूद फाइलें अभी भी अंदर होंगी।

git rm files_ignored; git commit -m 'rm no use files'उपेक्षित फ़ाइलों को हटाने के लिए उपयोग करें।


4
उनमें से बहुत सारे हैं, क्या उनके नाम को निर्दिष्ट किए बिना उन्हें हटाने का एक तरीका है?
Intrepidd
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.