2010-08-11 14 views
57

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

+3

आंशिक डुप्लिकेट, निश्चित रूप से पिछले प्रश्न के अंतर्गत आने वाले प्राप्त कर सकते हैं: http://stackoverflow.com/questions/307828/git-remove-file-accidentally-added-to -the-repository http://stackoverflow.com/questions/1216733/remove-a-directory- स्थायी रूप से- से – Cascabel

उत्तर

110

उपकरण जो आप चाहते हैं git filter-branch है। इसके उपयोग here वर्णन किया गया है, लेकिन मूल रूप:

$ git filter-branch --tree-filter 'rm -f my_file' HEAD 

हर प्रतिबद्ध से "my_file" को हटा देगा।

ध्यान दें कि यह प्रत्येक प्रतिबद्धता को फिर से लिखता है, इसलिए यदि आप रिमोट रिपोजिटरी में धक्का देते हैं, तो आपको (ए) अपडेट को मजबूर करना होगा, और (बी) आपके द्वारा खींचा गया हर कोई अब डुप्लिकेट काम करेगा (चूंकि आप फिर से लिखते हैं इतिहास), जैसा कि git rebase man page पर वर्णित है।

+15

मैं '--prune-खाली' जोड़ने की अनुशंसा करता हूं ताकि परिणामस्वरूप उत्पन्न कोई भी खाली कार्य हटा दिया जाएगा भी। – fnkr

+0

यह विभिन्न निर्देशिकाओं में एक ही नाम के साथ कई फ़ाइलों के साथ एक भंडार पर कैसे काम करता है? क्या यह एक ही नाम वाली सभी फाइलों को हटा देता है? – CodeMonkey

+1

@CodeMonkey: उस स्थिति में, आप एक लंबा, अद्वितीय पथ का उपयोग करेंगे। – mipadi

5

यह git filter-branch है, लेकिन सावधान रहें कि आपका रेपो इतिहास बदल जाएगा, और इतिहास पुन: लिखने के बाद प्रतिबद्ध हैश अलग होंगे।

आप भी स्थान खाली करना चाहते हैं, मैं सुझाव है कि आप git forget-blob उपयोग करें, क्योंकि अकेले git filter-branch Git अपनी फ़ाइल भूल जाते हैं, के रूप में यह अभी भी रिमोट, reflog, टैग और इस तरह से संदर्भित किया जा सकता है नहीं होगा।

git forget-blob main.c.swp

आप अधिक जानकारी के here

संबंधित मुद्दे

 संबंधित मुद्दे