2012-06-15 15 views
43

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

मैंने git rm -rf xxxxxx का उपयोग कर सभी फ़ाइलों को हटा दिया और मैंने --cached विकल्प भी चलाया।

कोई मुझे बता सकते हैं कि कैसे मैं एक बड़ी .pack फ़ाइल निम्न निर्देशिका में है कि निकाल सकते हैं:

.git/objects/pack/pack-xxxxxxxxxxxxxxxxx.pack

मैं सिर्फ शाखा मैं अभी भी है, लेकिन अब और नहीं कर रहा हूँ कि निकालने की आवश्यकता है का उपयोग करते हुए? या क्या मुझे कुछ और चलाने की ज़रूरत है?

मुझे यकीन नहीं है कि यह कितना अंतर बनाता है लेकिन यह फ़ाइल के खिलाफ पैडलॉक दिखाता है।

धन्यवाद


संपादित

यहाँ मेरी bash_history से कुछ अंश है कि एक विचार है कि कैसे मैं इस राज्य में पाने में कामयाब रहे हैं देना चाहिए (इस बिंदु मैं एक Git शाखा पर काम कर रहा हूँ पर ग्रहण 'मेरे शाखा' कहा जाता है और मैं अधिक फ़ोल्डर/फ़ाइलें) वाला कोई फ़ोल्डर मिल गया है:

git add . 
git commit -m "Adding my branch changes to master" 
git checkout master 
git merge my-branch 
git rm -rf unwanted_folder/ 
rm -rf unwanted_folder/  (not sure why I ran this as well but I did) 

मैंने सोचा कि मैं भी भाग गया निम्नलिखित लेकिन यह टी के साथ bash_history में प्रकट नहीं होता वह दूसरों:

git rm -rf --cached unwanted_folder/ 

मैं भी सोचा था कि मैं कुछ Git आदेशों भाग गया (जैसे git gc) पैक फ़ाइल को साफ़ रखने के लिए प्रयास करने पर वे .bash_history फ़ाइल में या तो नहीं दिखाई देते।

+0

क्या आप स्पष्ट कर सकते हैं कि आपने उन्हें कैसे हटाया? अगर वे अभी भी प्रतिबद्ध इतिहास में हैं, तो वे अभी भी आपकी पैक फाइलों में हैं। – loganfsmyth

+0

हाय @loganfsmyth, मैंने बैश इतिहास स्क्रिप्ट्स को जोड़ा है जो उम्मीदपूर्वक मदद करेंगे। – user1116573

उत्तर

114

समस्या यह है कि, भले ही आपने फ़ाइलों को हटा दिया हो, फिर भी वे पिछले संशोधन में मौजूद हैं। यह गिट का पूरा बिंदु है, यह है कि अगर आप कुछ हटा देते हैं, तो भी आप इतिहास तक पहुंच कर इसे वापस प्राप्त कर सकते हैं।

जो आप करना चाहते हैं उसे पुनर्लेखन इतिहास कहा जाता है, और इसमें git filter-branch कमांड शामिल था।

गिटहब की साइट पर इस मुद्दे का एक अच्छा स्पष्टीकरण है। https://help.github.com/articles/remove-sensitive-data

अधिक सीधे आपके सवाल का जवाब करने के लिए, क्या आप मूल रूप से चलाने की आवश्यकता यह है:

git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch unwanted_folder' --prune-empty 

इस रेपो के इतिहास से फाइल के सभी संदर्भ निकाल देंगे।

अगला, आप इसे पैकफाइल से फ़ाइलों को वास्तव में हटाने के लिए इसे चलाने के लिए चाहते हैं।

git gc --aggressive --prune 
+3

यह सही जवाब नहीं है? – Dvir669

+1

हाँ यह निश्चित रूप से स्वीकार्य उत्तर होना चाहिए। – JaKXz

+0

मैंने इसे स्वीकार करने के रूप में चिह्नित किया है अगर इससे भविष्य में इस प्रश्न पर आने वाले किसी के लिए यह आसान हो जाता है, हालांकि मैंने वास्तव में एक नई गिट रेपो – user1116573

3

एक विकल्प:

रन git gc मैन्युअल एक या कुछ पैक फ़ाइलों में पैक फ़ाइलों की एक संख्या गाढ़ा करने के लिए। यह कार्रवाई लगातार है (यानी बड़े पैक फ़ाइल इसकी संपीड़न व्यवहार रख सकेंगे) तो यह git gc --aggressive

एक अन्य विकल्प कोड बचाने के लिए और कहीं .git और फिर .git नष्ट करने के लिए है के साथ समय-समय पर भंडार संपीड़ित करने के लिए फायदेमंद हो सकता है और एक नया गिट भंडार (git init) बनाने, इस मौजूदा कोड का उपयोग करके फिर से शुरू करें।

+0

हाय माइकल, मैंने 'गीट जीसी' चलाने की कोशिश की और केवल दो पैक फाइलों तक पहुंच गई लेकिन बड़ी संख्या में से एक अभी भी उनमें से एक है और मैं इसे से छुटकारा पाना चाहता हूं ताकि मैं फ़ोल्डर को बाहरी रूप से आसान बना सकूं (ज़िप पहले 1-2 एमबी था, अब 55 एमबी)। जब तक कोई और कुछ सुझाव नहीं दे सकता है, मुझे लगता है कि मुझे एक नया गिट बनाना पड़ सकता है। मुझे लगता है कि इसका मतलब है कि मैं उन शाखाओं तक पहुंच खो दूंगा जिनके पास वर्तमान में आदि है ...? – user1116573

+1

मैंने कोशिश की और बस .git फ़ोल्डर को हटा दिया और जैसा कि आपने कहा था एक नया गिट भंडार बनाया। मैं इसे एक सबक सीखा होगा। धन्यवाद माइकल। – user1116573

+2

यह ज्यादा समझ में नहीं आता है। आप वर्तमान भंडार को मजबूत करने और प्रक्रिया में पैक फ़ाइलों को हटाने के लिए गिट को क्यों नहीं बता सकते? – jml

4

परिदृश्य एक: अपनी बड़ी फ़ाइलों को केवल एक शाखा में शामिल किया गया है, तो आप git filter-branch चलाने की जरूरत नहीं है।

git branch -D mybranch 
git reflog expire --expire-unreachable=all --all 
git gc --prune=all 

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

git checkout master 
git log # Find the commit hash just before the merge 
git reset --hard <commit hash> 

तब परिदृश्य ए से कुछ कदम दूर चलाने

परिदृश्य सी: अगर वहाँ थे शाखा से अन्य परिवर्तन मर्ज करने के बाद मास्टर पर या परिवर्तन है कि आप रखना चाहते हैं, यह सबसे अच्छा होगा मास्टर rebase करने के लिए और चुनिंदा शामिल करता है कि आप चाहते हैं:

git checkout master 
git log # Find the commit hash just before the merge 
git rebase -i <commit hash> 

अपने संपादक में, उन फ़ाइलों को हटा दें जो बड़ी फ़ाइलों को जोड़ते हैं, लेकिन बाकी सब कुछ छोड़ दें। सेव करके छोड़ो। आपकी मास्टर शाखा में केवल वही होना चाहिए जो आप चाहते हैं, और कोई बड़ी फाइल नहीं है। ध्यान दें कि git rebase बिना -p मर्ज कमेट को खत्म कर देगा, इसलिए आपको <commit hash> के बाद मास्टर के लिए एक रैखिक इतिहास के साथ छोड़ा जाएगा। यह शायद आपके लिए ठीक है, लेकिन यदि नहीं, तो आप -p के साथ प्रयास कर सकते हैं, लेकिन git help rebase कहते हैं combining -p with the -i option explicitly is generally not a good idea unless you know what you are doing

तब परिदृश्य ए

+0

परिदृश्य ए का एक प्रकार है [यहां] (http: // stackoverflow .com/q/33191910/4400585) हालांकि, एक अतिरिक्त अप्रत्याशित समस्या के साथ। –

0

से कमांड चलाने मैं इस शो के लिए देर हो चुकी है, लेकिन मामले में ऊपर जवाब क्वेरी का समाधान नहीं तो मैं एक और रास्ता मिल गया एक छोटे से कर रहा हूँ। बस .pack से विशिष्ट बड़ी फ़ाइल को हटा दें। मुझे यह समस्या थी जहां मैंने गलती से एक बड़ी 2 जीबी फाइल में चेक किया था। मैंने इस लिंक में समझाए गए चरणों का पालन किया: http://www.ducea.com/2012/02/07/howto-completely-remove-a-file-from-git-history/