2012-10-12 19 views
10

बचाने के लिए गिट रिपोजिटरी से पुरानी प्रतिबद्ध जानकारी निकालें मेरे पास कुछ बड़ी बाइनरी फाइलें (tifs, jpgs, pdfs) को संग्रहित करने के लिए एक संग्रह है जो बहुत बड़ा बढ़ रहा है। वहां बनाई गई फ़ाइलों की उचित मात्रा भी है, जिन्हें हटाया गया है, हटाया गया है और नाम दिया गया है और मुझे व्यक्तिगत प्रतिबद्धता इतिहास की परवाह नहीं है। यह सवाल कुछ हद तक सरलीकृत है क्योंकि मैं एक भंडार से निपट रहा हूं जिसमें कोई शाखा नहीं है और कोई टैग नहीं है।स्पेस

मुझे उत्सुकता है कि अंतरिक्ष बचाने के लिए सिस्टम से कुछ इतिहास को हटाने का कोई आसान तरीका है।

मैं एक पुराने धागा on the git mailing list पाया लेकिन यह वास्तव में कैसे (यानी क्या $ ड्रॉप है) इस का उपयोग करने के लिए निर्दिष्ट नहीं करता है:

git filter-branch --parent-filter "sed -e 's/-p $drop//'" \ 
     --tag-name-filter cat -- \ 
     --all ^$drop 
+0

उत्सुक, आप से 10 जीबी परियोजना फ़ाइल, आप कितनी जगह को बचाने में सक्षम हैं? 2Mbs? 25 एमबी या 200 एमजीबी की तरह ?! – Honey

+0

मेरे मामले में, भंडार में 9 0% फाइलों की अभी भी आवश्यकता थी, इसलिए यह केवल ~ 10% अंतरिक्ष बचाया गया। – greggles

+0

आपका मतलब है कि आपने 1 जीबी बचाया है ?! या गिट से संबंधित मेटा डेटा का 10%? कौन सा था? – Honey

उत्तर

8

मुझे लगता है, आप अपने इतिहास को इस जवाब निम्नलिखित हटना कर सकते हैं:

How to delete a specific revision of a github gist?

तय पर जो इतिहास में बताते हैं, आप रखना चाहते हैं।

pick <hash1> <commit message> 
pick <hash2> <commit message> 
pick <hash3> <commit message> <- keep 
pick <hash4> <commit message> 
pick <hash5> <commit message> 
pick <hash6> <commit message> <- keep 
pick <hash7> <commit message> 
pick <hash8> <commit message> 
pick <hash9> <commit message> 
pick <hash10> <commit message> <- keep 

फिर, के बाद प्रत्येक के रूप में "लेने" और "स्क्वैश" दूसरों के निशान "रखना" पहले छोड़ दें।

pick <hash1> <commit message> 
squash <hash2> <commit message> 
squash <hash3> <commit message> <- keep 
pick <hash4> <commit message> 
squash <hash5> <commit message> 
squash <hash6> <commit message> <- keep 
pick <hash7> <commit message> 
squash <hash8> <commit message> 
squash <hash9> <commit message> 
squash <hash10> <commit message> <- keep 

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

उस रिबेस के बाद, इंटरमीडिएट फ़ाइल डेटा अभी भी भंडार में होगा लेकिन अब संदर्भित नहीं होगा। git gc अब आपको उस डेटा से छुटकारा पा जाएगा।

+0

ऐसा लगता है कि यह उपयोगी हो सकता है अगर मैं सिर्फ प्रत्येक प्रतिबद्धता (या एक्स तिथि से पहले प्रत्येक प्रतिबद्धता) को स्क्वैश करता हूं लेकिन यह कठिन लगता है। क्या ऐसा करने के लिए एक और स्वचालित तरीका है? – greggles

+0

इसके अलावा, मेरा पूरा लक्ष्य डिस्क स्पेस को सहेजना है, इसलिए मुझे आश्चर्य है कि क्या आपके पास कुछ आंकड़े हैं कि यह एक बड़े रेपो (~ अपेक्षाकृत बड़ी फ़ाइलों की ~ 10GB) में कितनी जगह बचा सकता है। अगर मैं मेटा-डेटा को हटा देता हूं लेकिन हटाए गए ऑब्जेक्ट्स के बारे में जानकारी नहीं तो मुझे लगता है कि इससे ज्यादा मदद नहीं मिलेगी। – greggles

+1

एक प्रतिबद्धता को हटाकर, आप पेड़ डेटा के मेटाडेटा और संदर्भों को हटा रहे हैं। यदि इसका मतलब है कि अंतिम संदर्भ गिरा दिया गया है (कोई अन्य प्रतिबद्ध विशिष्ट सामग्री का संदर्भ नहीं देता है), वास्तविक पेलोड अगले 'जीसी' पर हटा दिया जाता है। उदाहरण के लिए, यदि आप किसी दिए गए फ़ाइल को उस प्रतिबद्धता तक जोड़कर स्क्वैश कर रहे हैं जिसमें इसे फिर से हटाया गया है, तो फ़ाइल डेटा वास्तव में 'gc' पर छोड़ा जाएगा। –

6

तुम हमेशा सिर्फ .git हटा सकते हैं और कर एक ताजा git --init एक साथ प्रारंभिक प्रतिबद्धता यह निश्चित रूप से, सभी प्रतिबद्ध इतिहास को हटा देगा।

+0

हाँ, निश्चित रूप से इसे एक आसान लेकिन कठोर विकल्प के रूप में देखते हुए। मैं .git repo को बंद कर दूंगा और फिर ऐसा करूंगा। मैं कुछ कम कठोर के लिए उम्मीद कर रहा हूँ :) – greggles

+0

'गिट init'। '--init' क्यों? –

+1

मूल रूप से: 'चाल। गिट/कहीं और/अन्य; गिट इनिट; गिट एड .; गिट प्रतिबद्ध -एम "प्रारंभिक प्रतिबद्धता"; गिट मूल जोड़ें [repoUrl]; गिट पुश उत्पत्ति --force' –

3

$ ड्रॉप एक चर रहा है

(जिसे आप खोज करना चाहते हैं) आप अनावश्यक फ़ाइलों को साफ और आप आदेश git gc

और git prune जांच करना चाहिए स्थानीय भंडार अनुकूलन करने के लिए चाहते हैं, क्योंकि एक और विकल्प है यह ऐसी वस्तुओं को हटा देता है जो किसी भी पहुंच योग्य शाखा में किसी ऑब्जेक्ट द्वारा इंगित नहीं किए जाते हैं।

मुझे उम्मीद है कि यह आपकी मदद कर सकता है।

+0

यह किसी भी ऑब्जेक्ट पर लागू नहीं होता है जो अभी भी इतिहास में है और यही मुझे लगता है कि सवाल यह है। –

+0

ये उपयोगी प्रतीत होते हैं, लेकिन मैं अभी भी उस आदेश का उपयोग करने के बारे में उलझन में हूं (उदाहरण के लिए कम या ज्यादा इतिहास रखने के लिए ट्विक करने के लिए तर्क क्या हैं)। – greggles

+0

"गिट जीसी" कॉल "गिट प्रून" कहते हैं। Https://git-scm.com/docs/git-prune#_notes – Hackless

1

यदि आप अपने गिट इतिहास से बड़ी फ़ाइलों को ढूंढना और निकालना चाहते हैं, तो Pro Git में Removing Objects नामक एक अनुभाग है, जो आपको इस प्रक्रिया के माध्यम से मार्गदर्शन करता है। यह थोड़ा जटिल है, लेकिन यह आपको अपने इतिहास से फ़ाइलों को हटाने की अनुमति देगा जो आपने अपने बाकी इतिहास को बरकरार रखते हुए वैसे भी हटा दिया है।

0

गिट को फ़ाइल के बारे में भूलना थोड़ा जटिल है।

git rm केवल इस शाखा पर फ़ाइल को हटा देगा, लेकिन यह इतिहास में रहता है और गिट इसे याद रखेगा।

ऐसा करने का सही तरीका git filter-branch है, जैसा कि अन्य ने यहां उल्लेख किया है। यह उस फ़ाइल को हटाने के लिए शाखा के इतिहास में हर प्रतिबद्धता को फिर से लिख देगा।

लेकिन, ऐसा करने के बाद भी, गिट इसे याद रख सकता है क्योंकि इसमें रीफ्लॉग, रिमोट, टैग और ऐसे में संदर्भ हो सकते हैं।

मैं एक छोटे से उपयोगिता यह आसान है git forget-blob

https://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/

बुलाया लिखा था, बस git forget-blob file1.txt है।

यह प्रत्येक संदर्भ को हटा देगा, git filter-branch करें, और आखिर में गिट कचरा कलेक्टर git gc चलाएं ताकि पूरी तरह से आपके रेपो में इस फ़ाइल से छुटकारा पा सके।

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