2012-05-18 8 views
17

मैंने git filter-branch का उपयोग करके कुछ बड़ी एफएलवी फाइलों को हटाने के लिए अपने भंडार के इतिहास को फिर से लिखा है।फ़िल्टर-शाखा के साथ स्क्रब करने के बाद, मेरे पैकफाइल में बड़ी फ़ाइलें अभी भी क्यों मौजूद हैं?

बड़े FLVs निकाला जा रहा है:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch public/video/*.flv' --prune-empty -- --all 

मूल refs हटाना:

reflog समाशोधन मैं मुख्य रूप से removing sensitive data पर Github लेख लेख और इसी तरह के निर्देश इंटरनेट पर कहीं भी पाई का पालन किया:

git reflog expire --expire=now --all 

पहुंचने योग्य वस्तुओं काटने:

git gc --prune=now 

Aggressivly छंटाई नहीं पहुंचा जा सकता वस्तुओं:

git gc --aggressive --prune=now 

repacking बातें:

:

git repack -A -d 

और मेरे gitdir अभी भी 205 एमबी, एक भी packfile में लगभग पूरी तरह से निहित है

$ du -h .git/objects/pack/* 
284K .git/objects/pack/pack-f72ed7cee1206aae9a7a3eaf75741a9137e5a2fe.idx 
204M .git/objects/pack/pack-f72ed7cee1206aae9a7a3eaf75741a9137e5a2fe.pack 

this script का उपयोग करना, मैं देख सकता हूँ कि FLVs मैं हटा दिया है अभी भी पैक में शामिल हैं:

All sizes are in kB's. The pack column is the size of the object, compressed, inside the pack file. 
size pack SHA          location 
17503 17416 1be4132fa8d91e6ce5c45caaa2757b7ea87d87b0 public/video/XXX_FINAL.flv 
17348 17261 b7aa83e187112a9cfaccae9206fc356798213c06 public/video/YYY_FINAL.flv 
.... 

git clone --bare my-repo पैदावार my-repo.git जो भी आकार में 205MB है के माध्यम से भंडार क्लोनिंग।

पैक से इन (संभवतः) अनियंत्रित वस्तुओं को हटाने और मेरे भंडार को वापस आकार में बदलने के लिए मैं क्या कर सकता हूं, अगर ऐसा कभी नहीं किया जाएगा तो क्या होगा? अगर उन्हें अभी भी किसी भी तरह से संदर्भित किया गया है, तो कहने का कोई तरीका है?

अद्यतन

प्रयास कर पर करने के लिए फिर से चलाने के git filter-branch, मैं इस नोटिस मिला:

Cannot create a new backup. 
A previous backup already exists in refs/original/ 
Force overwriting the backup with -f 

मैं सत्यापित वहाँ .git/refs/original में थे कि कोई refs, वास्तव में, निर्देशिका नहीं था बिल्कुल मौजूद है। क्या कोई अन्य तरीका है कि गिट स्टोर रिफ्रेश करता है, जिसे मैं नहीं जानता?

+0

'गिट क्लोन - बेयर माय-रेपो' के माध्यम से भंडार क्लोनिंग 'my-repo.git'' जो आकार में 205 एमबी भी है, इसलिए नहीं; पैकफाइल और इसकी विशाल सामग्री क्लोन के साथ आती है। – meagar

+0

आपका हटाया गया उत्तर दिलचस्प है और दूसरों के लिए उपयोगी हो सकता है - क्या आप अपने प्रश्नों को आपके द्वारा किए गए आदेशों के वास्तविक क्रम का वर्णन करने के लिए संपादित करने पर विचार करेंगे, और फिर पैक किए गए 'रेफ/मूल' रेफरी के बारे में बताए गए उत्तर को वापस दे देंगे? (यह एक सूक्ष्म बिंदु है कि आपके पास रेफरी हो सकती है जो पैक फाइलों में मौजूद है, न कि 'refs' के तहत एक फ़ाइल।) –

+0

@ मार्क लॉन्गियर मैं अभी भी अपने हटाए गए उत्तर से परिणामों को पुन: पेश करने की कोशिश कर रहा हूं। मैंने रेपो को क्लोन कर दिया है, और पाया है कि 'rit-rf .git/refs/original' चल रहा है * ** से पहले 'git repack -a' * चल रहा है ** ** ** परिणाम को प्रभावित नहीं करता है। यह '.git/refs/original' की सामग्री को प्रभावित नहीं करता है। – meagar

उत्तर

7

भंडार की ताज़ा प्रति क्लोनिंग पर, मैंने बिल्कुल ऊपर के रूप में कमांड चलाने के लिए, और वांछित परिणाम प्राप्त कर रहा था: मेरा .git निर्देशिका 20 एमबी करने के लिए नीचे 205 एमबी से कम हो गया था, और बड़े FLV फ़ाइलों को पैकफाइल से साफ हटा दिया गया था।

पहला प्रयास एक ताजा क्लोन पर भी किया गया था जिस पर मैंने कोई संशोधन नहीं किया था, इसलिए मेरे पास एक संतोषजनक स्पष्टीकरण नहीं है कि एफएलवी फाइलें पैकफाइल के अंदर क्यों रहती रहीं।

मैं मूल रूप से .git/refs/original हटाने, पैक बनने के लिए इतना है कि जब मैं .git/refs/original को दूर किया कोई प्रभाव नहीं था मूल refs के कारण पहले नीचे दिए गए जवाब प्रस्तुत, यह सोच कर git repack -a चलाकर है कि मैं एक समस्या का कारण था; मेरे मूल रेफरी अभी भी बड़ी एफएलवी फाइलों का संदर्भ दे रहे हैं। हालांकि, यह पकड़ नहीं लग रहा है। के तुरंत बाद git repack -a के अतिरिक्त भंडार की ताजा क्लोन प्रतिलिपि पर उपर्युक्त आदेशों को चलाना परिणाम को प्रभावित नहीं करता है - एफएलवी फाइलें अभी भी पैकफाइल से शुद्ध हैं। मेरे पास यह विश्वास करने का कोई कारण नहीं है कि यह मूल समस्या के लिए प्रासंगिक है।


कुछ अन्य तरीका है कि Git भंडार refs, कि मैं के बारे में पता नहीं है है?

है। यह पता चला है कि ऊपर सूचीबद्ध अनुसार आदेशों के क्रम के बारे में मैं पूरी तरह सत्य नहीं था। मैंने git repack -arm -rf .git/refs/original चलाकर rm -rf .git/refs/original चलाया था, और गिट ने रेफर्स को पैक किया था (यह निर्धारित करने के लिए कि अब कहां प्रयोग कर रहा है)। जब मैं rm -rf .git/refs/original चला गया, कुछ भी हटा दिया गया था। git gc मेरी पैकफाइल को कम करने में असमर्थ था क्योंकि पैक किए गए refs/original रेफ के कारण पुरानी फ़ाइलों के लिए अभी भी संदर्भित संदर्भ हैं।

+0

जहां पैक किए गए रेफरी जाते हैं, वहां '.git/packed-refs' – twalberg

+4

देखें, क्या आप उत्तर में दिए गए सटीक चरणों को संक्षेप में सारांशित कर सकते हैं? मुझे एक ही समस्या है और मैं इसे आजमाकर ठीक करना चाहता हूं। –

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

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