आपको कितनी बार गिट-जीसी का उपयोग करना चाहिए?


233

आपको कितनी बार गिट-जीसी का उपयोग करना चाहिए?

मैन्युअल पृष्ठ बस का कहना है:

उपयोगकर्ताओं को अच्छा डिस्क स्थान उपयोग और अच्छा ऑपरेटिंग प्रदर्शन बनाए रखने के लिए प्रत्येक रिपॉजिटरी के भीतर नियमित आधार पर इस कार्य को चलाने के लिए प्रोत्साहित किया जाता है।

क्या कुछ वस्तु प्राप्त करने के लिए कुछ कमांड हैं जो यह पता लगाने के लिए कि क्या यह जीसी का समय है?


इस तरह के कार्य क्रोन के लिए प्रमुख उम्मीदवार हैं (यदि आप लिनक्स का उपयोग कर रहे हैं) minhajuddin.com/2011/12/09/…
खाजा मिन्हाजुद्दीन

1
नोट: सेटिंग gc.autodetach(Git 2.0 Q2 2014) git gc --autoउपयोगकर्ता को बिना ब्लैंक किए चलाने में मदद कर सकती है । देखने के नीचे मेरा उत्तर
वॉनक

जवाबों:


204

यह ज्यादातर इस बात पर निर्भर करता है कि रिपॉजिटरी का उपयोग कितना किया जाता है। सप्ताह में एक बार एक उपयोगकर्ता की जाँच और एक सप्ताह में एक बार शाखा / मर्ज / आदि के संचालन के साथ, आपको शायद इसे वर्ष में एक बार से अधिक चलाने की आवश्यकता नहीं है।

कई दर्जन डेवलपर्स कई दर्जन परियोजनाओं पर काम कर रहे हैं, जो प्रत्येक दिन में 2-3 बार चेक करते हैं, आप इसे रात में चलाना चाहते हैं।

यह जरूरत से ज्यादा बार इसे चलाने के लिए चोट नहीं करेगा, हालांकि।

मैं क्या करूं इसे अभी चलाया जाता है, फिर एक हफ्ते से अब डिस्क उपयोग का माप लें, इसे फिर से चलाएँ, और डिस्क उपयोग फिर से मापें। यदि यह आकार में 5% गिरता है, तो इसे सप्ताह में एक बार चलाएं। यदि यह अधिक गिरता है, तो इसे अधिक बार चलाएं। यदि यह कम गिरता है, तो इसे कम बार चलाएं।


17
मैनुअल कहते हैं, "कुछ git कमांड्स git gc --auto को ऑपरेशन करने के बाद चलाते हैं जो कई ढीली वस्तुएं बना सकते हैं।" किसी को पता है कि वास्तव में कौन से आदेश इसे चलाते हैं?
जोशुआ नृत्य

2
एक बड़ा गिट विद्रोह एक स्पष्ट उदाहरण है, क्योंकि कई कमिट्स एक नए इतिहास में फिर से लिखे गए हैं - आपके रेपो में बहुत सारे पुराने कमिट्स छोड़ना जो वर्तमान शाखा का हिस्सा हैं
mafrosis

20
"यह जरूरत से ज्यादा बार इसे चलाने के लिए दर्द नहीं होगा" ... मैं पूरी तरह से सहमत नहीं हूं। जैसा कि अरस्तू बताते हैं, झूलना कमिट एक अच्छा बैकअप तंत्र बना सकता है।
जेसन बेकर

105

ध्यान दें कि कचरा इकट्ठा करने का नकारात्मक पक्ष यह है कि अच्छी तरह से, कचरा एकत्र हो जाता है। जैसा कि हम सभी कंप्यूटर उपयोगकर्ता के रूप में जानते हैं, जिन फ़ाइलों को हम कचरा मानते हैं, वे भविष्य में तीन दिन के लिए बहुत मूल्यवान हो सकते हैं। तथ्य यह है कि गिट अपने मलबे के चारों ओर रखता है कई बार मेरे बेकन को बचाया है - सभी झूलने वाले ब्राउज़ करके, मैंने बहुत काम किया है जो मैंने गलती से डिब्बाबंद कर दिया था।

तो अपने निजी क्लोनों में बहुत अधिक स्वच्छ सनकी मत बनो। इसकी बहुत कम जरूरत है।

OTOH, डेटा पुनर्प्राप्ति का मूल्य मुख्य रूप से रिमोट के रूप में उपयोग किए जाने वाले रेपो के लिए संदिग्ध है, जैसे। वह स्थान जहां सभी देवता धक्का देते हैं और / या से खींचे जाते हैं। वहां, यह एक जीसी रन और बार-बार रिपैकिंग को बंद करने के लिए समझदार हो सकता है।


38
एफडब्ल्यूआईडब्ल्यू सभी ढीली वस्तुओं को इकट्ठा नहीं करते हैं, केवल डिफ़ॉल्ट (सीएएफ git gc --help, विशेष रूप से --pruneविकल्प) द्वारा 2 सप्ताह से अधिक पुराने हैं । इसका भी उल्लेख है gc.reflogExpire, जो मुझे विश्वास दिलाता है कि पिछले 90 दिनों में आपके द्वारा देखी गई किसी भी वस्तु को एकत्र नहीं किया जाएगा। (मेरा git संस्करण: v1.7.6)
RobM

30

आवश्यक होने पर git के हाल के संस्करण स्वचालित रूप से चलते हैं, इसलिए आपको कुछ भी नहीं करना चाहिए। मैन git-gc (1) के विकल्प अनुभाग देखें : "कुछ git कमांड संचालन git gc --auto चलाने के बाद करते हैं जो कई ढीली वस्तुओं का निर्माण कर सकते हैं।"


13
मैंने इसे पहली बार कई साल पुरानी रिपॉजिटरी पर पहली बार चलाया था, और मेरी .it 16M से 2.9M, आकार में 82% की कमी हुई। इसलिए यह अभी भी कमांड को मैन्युअल रूप से चलाने के लिए उपयोगी लगता है।
दर्शन रिवका व्हेल

@DarshanRivkaWhittle क्या आपने उन कई वर्षों में अद्यतन किया था?
std''OrgnlDave 19

1
@ std''OrgnlDave हाँ, मैं हमेशा जो भी संस्करण आर्क पर चालू था, चला रहा था। मैंने इसे फिर से चलाया, शायद मेरी आखिरी टिप्पणी के बाद पहली बार (आपकी टिप्पणी मुझे याद दिलाते हुए धन्यवाद), और गीता 81M से 13M तक चली गई। मुझे gc --autoलगता है कि चलाने के किसी भी आदेश नहीं चलाना चाहिए , मुझे लगता है।
दर्शन रिवका व्हिटल

18

यदि आप Git-Gui का उपयोग कर रहे हैं , तो यह आपको बताता है कि आपको कब चिंता करनी चाहिए:

This repository currently has approximately 1500 loose objects.

निम्न आदेश एक समान संख्या लाएगा:

$ git count-objects

सिवाय इसके स्रोत से , गिट-गुई स्वयं गणित करेंगे, वास्तव में .git/objectsफ़ोल्डर में कुछ गिनते हैं और शायद एक अनुमान लगाते हैं (मुझे tclठीक से पढ़ना नहीं आता है!)।

किसी भी मामले में, यह लगभग 300 ढीली वस्तुओं की मनमानी संख्या के आधार पर चेतावनी देना प्रतीत होता है ।


वास्तव में यह चेतावनी देता है, लेकिन इसे gc चलाने देने पर, ज्यादातर समय gc एक काम नहीं करता है। इसलिए इसे करने के लिए git gui पर निर्भर रहना है, 6000 से अधिक ढीली वस्तुओं की प्रतीक्षा करना है, जिसमें हमेशा या तो चलाने के लिए gc पर क्लिक करना है और एक मिनट के लिए रुकना है या रद्द करना है: / संभवतः किसी को git gui को इस तरह से ठीक करना चाहिए, जो अधिकतम ढीली जांच करे ऑब्जेक्ट काउंट और डायलॉग दिखाने के लिए परेशान न करें जब तक कि गिनती सीमा तक न पहुंच जाए।
10

हां @ एमएलटू मैं सहमत हूं। जब मैंने यह लिखा था तो मैं सिर्फ इस पर ध्यान देना चाहता था। दोनों Git-Guiऔर count-objectsइस सवाल के बिल्कुल अच्छे जवाब नहीं हैं ... लेकिन उन्हें होना चाहिए!
cregox

मैं यह मतलब नहीं था कि यह एक बुरा जवाब है, बस यह बताना चाहता था कि अधिकांश समय गिट कुछ भी नहीं करता है। हालांकि मुझे लगता है कि जीसी जीसी बहुत कुछ नहीं करता है, सिवाय इसके कि जब करने के लिए पर्याप्त है या आपने आक्रामक स्विच का उपयोग किया है।
मलैतु


7

मैं एक बड़ा चेकआउट करने के बाद git gc का उपयोग करता हूं, और बहुत सी नई वस्तु है। यह अंतरिक्ष को बचा सकता है। जैसे अगर आप git-svn का उपयोग करके एक बड़ा SVN प्रोजेक्ट चेकआउट करते हैं, और git gc करते हैं, तो आप आमतौर पर बहुत सारी जगह बचाते हैं


क्या यह अभी भी सच है? यहां तक ​​कि '08 में HDD स्पेस सस्ता था, इसे चलाने के औचित्य के रूप में उपयोग करना व्यर्थ लगता है
Thymine

7

आप इसे बिना किसी रुकावट के कर सकते हैं, नई (Git 2.0 Q2 2014) सेटिंग के साथ gc.autodetach

देखें 4c4ac4d और 9f673f9 के लिए प्रतिबद्ध ( Nguy Thn Thái Ngọc Duy, उर्फ ​​pclouds ):

gc --autoसमय लगता है और उपयोगकर्ता को अस्थायी रूप से ब्लॉक कर सकता है (लेकिन किसी भी कम कष्टप्रद नहीं)।
इसे समर्थन करने वाले सिस्टम पर पृष्ठभूमि में चलाएं।
बैकग्राउंड में चलने के साथ खो जाने वाली एकमात्र चीज़ प्रिंटआउट है। लेकिन gc outputवास्तव में दिलचस्प नहीं है।
आप इसे बदलकर अग्रभूमि में रख सकते हैं gc.autodetach


उस 2.0 रिलीज के बाद से, एक बग था: git 2.7 (Q4 2015) त्रुटि संदेश को नहीं खोना सुनिश्चित करेगा ।
देखें 329e6e8 प्रतिबद्ध (19 सितं, 2015) द्वारा गुयेन थाई Ngọc Duy ( pclouds)
(द्वारा विलय Junio सी Hamano - gitster- में प्रतिबद्ध 076c827 , 15 अक्टू 2015)

gc: लॉग को डीमॉनेटाइज्ड से बचाएं gc --autoऔर अगली बार प्रिंट करें

जबकि 9f673f9 ( पृष्ठभूमि में gcचलने के लिए कॉन्फ़िगर विकल्प --auto- 2014-02-08) gc --autoटर्मिनल को ' ' हॉगिंग के बारे में कुछ शिकायतों को कम करने में मदद करता है , यह समस्याओं का एक और सेट बनाता है।

इस सेट में नवीनतम, डेमोनाइजिंग के परिणाम के रूप में है, stderrबंद है और सभी चेतावनियाँ खो गई हैं। अंत में यह चेतावनी cmd_gc()विशेष रूप से महत्वपूर्ण है क्योंकि यह उपयोगकर्ता को बताता है कि " gc --auto" बार-बार चलने से कैसे बचें ।
क्योंकि stderr बंद है, उपयोगकर्ता को पता नहीं है, स्वाभाविक रूप से वे gc --autoसीपीयू को बर्बाद करने के बारे में शिकायत करते हैं ।

Daemonized gcअब बचाता stderrकरने के लिए $GIT_DIR/gc.log। जब तक उपयोगकर्ता हटा नहीं देगा तब तक उसका
अनुसरण gc --autoनहीं किया जाएगा और gc.logप्रिंट नहीं किया जाएगाgc.log


6

इस उद्धरण से लिया गया है; Git के साथ संस्करण नियंत्रण

Git कचरा संग्रहण को स्वचालित रूप से चलाता है :

• यदि भंडार में बहुत अधिक ढीली वस्तुएं हैं

• जब दूरस्थ रिपॉजिटरी में एक धक्का होता है

• कुछ आदेशों के बाद जो कई ढीली वस्तुओं को पेश कर सकते हैं

• जब git reflog जैसी कुछ कमांड स्पष्ट रूप से अनुरोध करती हैं

और अंत में, कचरा संग्रह तब होता है जब आप स्पष्ट रूप से इसे git gc कमांड का उपयोग करके अनुरोध करते हैं। लेकिन वह कब होना चाहिए? इस सवाल का कोई ठोस जवाब नहीं है, लेकिन कुछ अच्छी सलाह और सर्वोत्तम अभ्यास है।

आपको कुछ स्थितियों में मैन्युअल रूप से git gc चलाने पर विचार करना चाहिए:

• यदि आपने अभी-अभी गिट फ़िल्टर-शाखा पूरी की है। याद रखें कि फ़िल्टर-शाखा कई कमानों को फिर से लिखती है, नए लोगों का परिचय देती है, और पुराने लोगों को एक ऐसे रिफ़र पर छोड़ देती है जिसे आपको परिणामों से संतुष्ट होने पर हटा दिया जाना चाहिए। उन सभी मृत वस्तुओं (जो अब संदर्भित नहीं हैं क्योंकि आपने अभी-अभी एक रेफ़र को इंगित किया है) को कचरा संग्रह के माध्यम से हटाया जाना चाहिए।

• कुछ आदेशों के बाद जो कई ढीली वस्तुओं को पेश कर सकते हैं। उदाहरण के लिए, यह एक बड़ा रीबेस प्रयास हो सकता है।

और फ्लिप की तरफ, आपको कचरा संग्रह से कब सावधान रहना चाहिए?

• अगर वहाँ अनाथ रेफरी है कि आप पुनर्प्राप्त करना चाहते हो सकता है

• गिट रीरे के संदर्भ में और आपको हमेशा के लिए प्रस्तावों को बचाने की आवश्यकता नहीं है

• केवल टैग और शाखाओं के संदर्भ में Git को स्थायी रूप से बनाए रखने के लिए पर्याप्त होने के कारण

• FETCH_HEAD पुनर्प्राप्ति के संदर्भ में (git लाने के माध्यम से URL-प्रत्यक्ष पुनर्प्राप्ति) क्योंकि वे तुरंत कचरा संग्रहण के अधीन हैं


2
मेरे पास मेरे पेड़ में अगम्य है (परिणामस्वरूप git commit --amend)। इससे सत्यापित किया जा सकता है git log --reflog। मैंने रिमोट रिपॉजिटरी की एक शाखा को धक्का दिया और अपने पेड़ को फिर से जांचा; अगम्य कमिट अभी भी थे। जाहिर है git gcकि जब यह धक्का हुआ तब नहीं चला था। …?
छुरी

4

जब मैं एक बड़ा कमिट करता हूं, सबसे ऊपर जब मैं रिपॉजिटरी से अधिक फाइल हटाता हूं, तो उपयोग करता हूं .. के बाद, कमिट्स तेज होते हैं


1

आपको git gcबहुत बार उपयोग करने की आवश्यकता नहीं है , क्योंकि git gc(कचरा संग्रह) स्वचालित रूप से कई बार उपयोग किए जाने वाले कमांड पर चलाया जाता है:

git pull
git merge
git rebase
git commit

स्रोत: git gc सर्वोत्तम प्रथाओं और FAQS

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