गिट रिपॉजिटरी का आकार कम करें


290

मैंने रेपो आकार को कम करने के लिए एक अच्छे ट्यूटोरियल की तलाश की, लेकिन कोई भी नहीं मिला। मैं अपने रेपो आकार को कैसे कम करूं ... यह 10 एमबी के बारे में है, लेकिन बात हरोकू केवल 50 एमबी की अनुमति देता है और मैं ऐसा नहीं हूं जहां मैं अपने ऐप को विकसित कर रहा हूं।

मैंने सामान्य संदिग्धों (लॉग, वेंडर, डॉक्टर आदि) को पहले से ही .ignignore में जोड़ दिया। हालाँकि मैंने हाल ही में .gitignore को जोड़ा है।

कोई सुझाव?


1
मैंने अभी किया और इसे 2.2 एमबी तक नीचे लाया ... बहुत बहुत धन्यवाद! हालांकि यह Heroku..hmm पर प्रेषण आकार को कम करने के लिए प्रतीत नहीं हुआ
भेजा गया

11
--फोर्स का उपयोग करके इसे पुश करें। यह तब भी सामग्री को ओवरराइट कर देगा, जब कोई बदलाव नहीं हुआ था (कोई नया काम नहीं करता है, आदि)
Marcin Gil

1
@MarcinGil - नीचे, VonC बताता है कि आपको दूरस्थ सर्वर को साफ करने के लिए सर्वर तक पहुंच की आवश्यकता है (यदि मैं इसे सही ढंग से पार्स कर रहा हूं)।
jww

1
अन्य पाठकों की मदद करने के लिए बस एक टिप्पणी अगर वे नहीं जानते कि क्या जोड़ना है .gitignore, तो gitignore.io पर एक अच्छी सेवा है जो आपको .gitignoreअपने देव वातावरण के आधार पर एक अच्छा सेट करने में मदद करेगी ।
ब्लेयरग 23

जवाबों:


352

git gc --aggressiveprune प्रक्रिया को लागू करने के लिए बाध्य करने का एक तरीका है (निश्चित होना:) git gc --aggressive --prune=now। रेपो को साफ करने के लिए आपके पास अन्य कमांड भी हैं। हालांकि मत भूलना, कभी-कभी git gcअकेले रेपो का आकार बढ़ा सकते हैं !

इसका उपयोग filter-branchइतिहास के बाद हटाए जाने वाले कुछ निर्देशिकाओं को चिन्हित करने के लिए भी किया जा सकता है (स्थान के और लाभ के साथ); यहाँ देखें । लेकिन इसका मतलब है कि कोई भी आपके सार्वजनिक रेपो से नहीं खींच रहा है। filter-branchमें बैकअप रेफरी रख सकते हैं.git/refs/original , ताकि निर्देशिका को भी साफ किया जा सके।

अंत में, जैसा कि इस टिप्पणी और इस प्रश्न में वर्णित है ; रिफ्लॉग को साफ करने से मदद मिल सकती है:

git reflog expire --all --expire=now
git gc --prune=now --aggressive

एक और भी अधिक पूर्ण, और संभवतः खतरनाक, समाधान एक अप्रकाशित वस्तु से अप्रयुक्त वस्तुओं को हटाने के लिए है


दूसरे परिदृश्य में, stackoverflow.com/questions/1029969/…
VonC

1
स्वयं पर ध्यान दें: दूरस्थ शाखाओं को न भूलें: stackoverflow.com/questions/11255802/…
VonC

1
स्वयं पर ध्यान दें: दूरस्थ टैग मत भूलना
saiyancoder

1
दूरस्थ संदर्भों के अलावा, रिफ्लॉग एक और चीज है जो उन संदर्भों का कारण बन सकती है जिन्हें आप हटाने की कोशिश कर रहे हैं। stackoverflow.com/q/27489761/1072626
vossad01

1
@jww मैं पुष्टि करता हूं कि यह विशुद्ध रूप से एक स्थानीय ऑपरेशन है। रिमोट रेपो के आकार पर इसका कोई असर नहीं है। आपको ऐसा करने के लिए उस दूरस्थ रेपो के सर्वर तक सीधी पहुंच की आवश्यकता होगी।
वॉन

94

आपके उत्तर के लिए धन्यवाद। यहाँ मैंने क्या किया है:

git gc
git gc --aggressive
git prune

लग रहा था कि चाल चल दी होगी। मैंने लगभग 10.5MB से शुरुआत की और अब यह 980KB से थोड़ा अधिक है।


8
pruneहमेशा gc(2 सप्ताह पहले डिफ़ॉल्ट के साथ) द्वारा चलाया जाता है ।
कास

117
यू सभी 3 prune के साथ अब तक का उपयोग कर चला सकते हैंgit gc --aggressive --prune=now
rahul286

1
लेकिन, जब मैं रेपो हटाता हूं तो इसे फिर से क्लोन करता हूं, आकार अभी भी बड़ा है। आप इसे कैसे संभालेंगे?
cwtuan

2

मेरे मामले में, मैंने कई बड़ी (> 100Mb) फ़ाइलों को धकेल दिया और फिर उन्हें निकालने के लिए आगे बढ़ा। लेकिन वे अभी भी मेरे रेपो के इतिहास में थे, इसलिए मुझे उन्हें भी इससे हटाना पड़ा।

क्या चाल थी:

bfg -b 100M  # To remove all blobs from history, whose size is superior to 100Mb
git reflog expire --expire=now --all
git gc --prune=now --aggressive

फिर, आपको अपनी शाखा पर बल लगाने की आवश्यकता है:

git push origin <your_branch_name> --force

bfg एक उपकरण है जिसे लिनक्स और macOS पर का उपयोग करके स्थापित किया जा सकता है:

brew install bfg
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.