2012-11-24 10 views
167

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

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

+3

की डुप्लीकेट [.gitignore अनदेखी नहीं दाखिल] (http://stackoverflow.com/questions/1139762/gitignore-file-not-ignoring) –

+0

http://stackoverflow.com/questions/1274057/ के समान बनाना-git-forget-about-a-file-that-was-tracked-but-is-now-in-gitignore – testing

+0

ट्रैक की गई फ़ाइल के बारे में [गिट बनाने के लिए कैसे "भूलें" के संभावित डुप्लिकेट को ट्रैक किया गया था लेकिन अब इसमें है। gitignore?] (https://stackoverflow.com/questions/1274057/how-to-make-git-forget-about-a-file-that-was-tracked-but-is-now-in-gitignore) –

उत्तर

260

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

git rm --cached file1 file2 dir/file3 

या, यदि आप फ़ाइलों की एक बहुत कुछ है:

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

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

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

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

+1

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

+0

@NateBundy हैं, यदि आप इस तथ्य का जिक्र कर रहे हैं कि 'xargs' रिक्त स्थान के साथ काम नहीं करेगा, तो अधिकांश कमांड लाइन यूटिलिटीज विशेष झंडे का उपयोग करके उसमें मिलती हैं ताकि सफेद जगह कोई फर्क नहीं पड़ता। मेरे सिर के ऊपर से मुझे याद नहीं है कि झंडे ls-files' और 'xargs' के लिए झंडे क्या हैं (मुझे लगता है कि यह 'xargs' के लिए' -0' हो सकता है), लेकिन आप उन्हें देख सकते हैं। –

+10

@ कूपके धन्यवाद। 'git ls-files -i -z - exclude-from = .gitignore | xargs -0 git rm --cached' चाल चल रहा है –

-1

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

लेकिन फ़ाइलों को पहले से ही भंडार में ही अस्तित्व में में अब भी हो जाएगा।

उपयोग git rm files_ignored; git commit -m 'rm no use files' नजरअंदाज कर दिया फ़ाइलों को हटाना।

+1

वहां उनमें से बहुत सारे हैं, क्या उनके नाम निर्दिष्ट किए बिना उन्हें हटाने का कोई तरीका है? – Intrepidd

197

एक आसान तरीका है कि किसी भी ओएस पर काम करता है .gitignore में

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

आप मूल रूप से readd सभी फाइलों को ऐसा करने के लिए, .gitignore

+0

यह अन्य उपयोगकर्ताओं को * पुल * निष्पादित करने वाले रेपो पर कैसे प्रभाव डालता है - जैसा कि मैंने इसे वह फ़ोल्डर पढ़ा है जिसे हम नहीं चाहते हैं अब ट्रैक करने के लिए हटा दिया गया है ??? हम इसे कैसे रोक सकते हैं - हम सिर्फ –

68

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

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

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

ध्यान रखें कि यह आदेश नई फ़ाइलों को भी हटा देगा जो स्टेजिंग क्षेत्र में नहीं हैं।

उम्मीद है कि यह मदद करता है।

+1

को अनट्रैक करना चाहते हैं। यह स्वीकार्य उत्तर होना चाहिए। यह वास्तव में काम करता है (स्वीकार किया गया जवाब मेरे लिए काम नहीं करता है, मैकोज़ पर), और यह क्लीनर है। –

+9

यह उत्तर लागू नहीं है - ओपी का कहना है कि '.gitignore' * में फ़ाइलों को ट्रैक किया जा रहा है। –

+0

सावधान! यह शाखा से निकालने के बजाए सभी अनचाहे फ़ाइलों को स्थायी रूप से हटा देता है – Emmanuel

3

मैं एसईडी साथ .gitignore बयान के उत्पादन में चालाकी करके एक बहुत ही सरल समाधान किया:

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

स्पष्टीकरण:

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