.Git फ़ोल्डर को कैसे सिकोड़ें


134

मेरे वर्तमान आधार का कुल आकार लगभग है। 200MB।

लेकिन मेरे .it फ़ोल्डर में 5GB (!) का एक अद्भुत आकार है। चूंकि मैं अपने काम को बाहरी सर्वर पर धकेलता हूं, इसलिए मुझे किसी बड़े स्थानीय इतिहास की जरूरत नहीं है ...

मैं अपनी नोटबुक पर कुछ स्थान खाली करने के लिए .गित फ़ोल्डर को कैसे छोटा कर सकता हूं? क्या मैं 30 दिनों से पुराने सभी परिवर्तनों को हटा सकता हूं?

मदद के लिए बहुत - बहुत शुक्रिया :)


2
आप के उत्पादन पोस्ट कर सकते हैं git count-objects -v?
CB बेली

जवाबों:


113

आपको 30 दिनों से पुराने सभी परिवर्तनों को नहीं हटाना चाहिए (मुझे लगता है कि यह किसी भी तरह से शोषण करने वाला संभव है, लेकिन वास्तव में अनुशंसित नहीं है)।

आप कॉल कर सकते हैं git gc --aggressive --prune, जो आपकी रिपॉजिटरी और पुरानी वस्तुओं में कचरा संग्रह करेगा। क्या आपके पास बहुत सारी बाइनरी फाइलें (अभिलेखागार, चित्र, निष्पादनयोग्य) हैं जो अक्सर बदलते हैं? वे आम तौर पर विशाल .गित फ़ोल्डर्स का नेतृत्व करते हैं (याद रखें, प्रत्येक संशोधन के लिए git स्टोर स्नैपशॉट्स और बाइनरी फाइलें बुरी तरह से संपीड़ित होती हैं)


32
दरअसल, git gc --aggressiveइसे बुरी प्रथा माना जाता है। इसका उपयोग करना बेहतर है git repack -a -d --depth=250 --window=250
अर्टफैक्ट

18
@ एकिटल: बिल्कुल। यहाँ स्वयं लिनुस का एक संदेश है: gcc.gnu.org/ml/gcc/2007-12/msg00165.html
Artefact2

3
@ artefact2: लिंक के लिए धन्यवाद! मैंने इसे पढ़ा है, और लाइनस बताते हैं, कि - प्रगतिशील (अच्छे) डेल्टास का पुन: उपयोग नहीं करेंगे - जो इस प्रश्न में मौजूद नहीं हैं, क्योंकि रिपॉजिटरी बहुत बड़ी है। रीपैक रास्ता जाने से वास्तव में बहुत अधिक समय लगेगा। git gc --aggressive250 (cf. manpage) की खिड़की के आकार और 250 की गहराई (cf. स्रोत कोड) के साथ रीपैक कहते हैं। - प्रगतिशील अतिरिक्त -fस्विच जोड़ता है , दूर फेंकने के लिए और पिछले सभी डेल्टा संचालन को फिर से करें (जैसा कि लिंक में भी उल्लेख किया गया है)
knittl

1
मैंने अभी gg - Remote -hg का उपयोग करके hg.nginx.org/nginx repo (RELEASE-1.4.0 टिप है) की जाँच की और इससे लगभग 100MB का रेपो निकला । इसका उपयोग करते हुए git gc --aggressive --pruneइसे 19MB तक लाया गया।
लीकेन्स्टाइन

15
@ Artefact2 आपका कथन पुराना है : ध्यान दें कि वह पोस्ट कितनी पुरानी है। वास्तव में, उसी दिन इसे पोस्ट किया गया था, मेलिंग सूची पर चर्चा इस परिणाम में हुई थी: [..] तो पैकिंग पैरामीटर इन दिनों या तो विधि के लिए समान हैं। --pruneयह भी आवश्यक नहीं है क्योंकि यह डिफ़ॉल्ट हो गया v1.5.5-rc0( 25ee973 , मार्च 2008)।
लेकेन्स्टाइन

68

यहां बताया गया है Git के निर्माता लीनुस कैसे अपना Git रेपो हटना के बारे में क्या कहना है:

"Git gc - प्रगतिशील" के बराबर - लेकिन किया * ठीक से * - करना है (रात भर) कुछ ऐसा

   git repack -a -d --depth=250 --window=250

जहां गहराई की बात बस इतनी ही है कि डेल्टा चेन कितनी गहरी हो सकती है (उन्हें पुराने इतिहास के लिए अधिक लंबा बना दें - यह स्पेस ओवरहेड के लायक है), और खिड़की की बात इस बारे में है कि हम प्रत्येक डेल्टा विंडो को स्कैन करने के लिए कितना बड़ा ऑब्जेक्ट विंडो चाहते हैं।

और यहाँ, आप अच्छी तरह से "-f" झंडे को जोड़ना चाह सकते हैं (जो कि "सभी पुराने डेल्टास को छोड़ दें", क्योंकि आप अब वास्तव में यह सुनिश्चित करने की कोशिश कर रहे हैं कि यह वास्तव में अच्छे उम्मीदवारों को ढूंढता है।

स्रोत: http://gcc.gnu.org/ml/gcc/2007-12/msg00165.html

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


मेरे लिए, .it फ़ोल्डर लगभग 1.5G है। मैंने यह कोशिश की, लेकिन मुझे followng त्रुटि मिली। fatal: Out of memory, malloc failed (tried to allocate 39763130 bytes)
मिरो

2
repackस्थानीय रूप से निष्पादित करने के बाद , एक कमिट और पुश करने के बाद , क्या हटना भी रिमोट बन जाएगा?
टिमो

@ दाविद देहघन: अरे मैंने प्रोजेक्ट डायरेक्टरी से यह कोशिश की थी, लेकिन .गित फ़ोल्डर का आकार नहीं बदला। क्या यह अपेक्षित है, या मुझे परिवर्तनों को देखने के लिए धक्का देना होगा? (खेद जीआईटी के साथ बहुत अनुभवी नहीं है।) मेरे पास रेपो में एक छवि / जीआईएफ है और मैंने उस छवि के कई बार अलग-अलग संस्करण किए हैं और मुझे लगता है कि वृद्धि हुई है। इसके आकार में।
जियोर्जिम

नमस्ते, दुर्भाग्य से अब यह है कि आप पुराने बाइनरी संस्करण को कैसे साफ करते हैं। ऐसा करने के लिए आपको अपने इतिहास को फिर से लिखना होगा जो वास्तव में जटिल है। यहाँ आपके लिए कुछ लीड है: docs.microsoft.com/en-us/azure/devops/articles/…
डेविड देहघन

22

मैंने ये कोशिश की लेकिन मेरा भंडार अभी भी बहुत बड़ा था। समस्या यह थी कि मैंने गलती से कुछ उत्पन्न बड़ी फ़ाइलों में जाँच की थी। कुछ खोज के बाद मुझे एक महान ट्यूटोरियल मिला, जिससे बड़ी उत्पन्न फ़ाइलों को हटाना आसान हो जाता है। इस ट्यूटोरियल ने मुझे अपनी रिपॉजिटरी को 60 एमबी से <1 एमबी तक सिकोड़ने की अनुमति दी।

स्टीव लोरक, हेट सिंक टू द जीट रिपोजिटरी


4
यहां लिंक रोट के मामले में एक संग्रहीत संस्करण है। इस उत्तर / एक रेपो के लिए मददगार था है मैं कहाँ .exe और .zip फ़ाइलें अंजाम दिया जो .git फ़ोल्डर का आकार फूला हुआ भर में आया था
DoubleDown

9

5GB बनाम 200MB एक तरह का अजीब है। चलाने की कोशिश करें git gc

लेकिन नहीं, जब तक आप अपने रिपॉजिटरी को मॉड्यूल में विभाजित नहीं करते हैं, आप .gitनिर्देशिका के आकार को कम नहीं कर सकते ।

गिट रेपो का प्रत्येक क्लोन एक पूर्ण विकसित भंडार है जो सर्वर के रूप में कार्य कर सकता है। यह वितरित संस्करण नियंत्रण का आधार सिद्धांत है।


3

मैं संस्करण इतिहास की तुलना में अधिक तुल्यकालन तंत्र के रूप में git का उपयोग कर रहा हूं। तो इस समस्या का मेरा समाधान यह सुनिश्चित करने के लिए है कि मेरे पास मेरे सभी वर्तमान स्रोत संतोषजनक स्थिति में हैं, और फिर .git को हटा दें और रेपो को फिर से शुरू करें। डिस्क स्थान की समस्या हल हो गई। :-) इतिहास चला गया :-( मैं ऐसा इसलिए करता हूं क्योंकि मेरा रेपो एक छोटी सी USB कुंजी पर है। मुझे अपने संपूर्ण इतिहास की आवश्यकता नहीं है या नहीं है। यदि मेरे पास इतिहास को रौंदने का कोई तरीका है, तो मैं इसका उपयोग करूंगा।

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


1
आप इसके बजाय ड्रॉपबॉक्स का उपयोग इस मामले के लिए कर सकते हैं। मैंने कई सालों तक किया।
जॉनी

0

उपरोक्त तरीकों की कोशिश की, मेरे मामले में कुछ भी काम नहीं किया (जहां मैंने गलती से गिट धक्का के दौरान गिट प्रक्रिया को मार दिया) इसलिए मुझे अंततः रेपो को हटाना पड़ा और इसे फिर से क्लोन करना पड़ा और अब .it फ़ोल्डर सामान्य आकार का है।


मुझे उसी समाधान का उपयोग करना पड़ा क्योंकि मेरी डिस्क पूरी भरी हुई थी (.गित फ़ोल्डर> 90 जीबी) इसलिए मैं रिपेक या गिट जीसी भी नहीं चला सकता था!
Fl4v
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.