"ऑटो अधिकतम प्रदर्शन के लिए भंडार पैकिंग" का क्या अर्थ है?


225

मुझे अपने git रेपो के साथ समस्या हो रही है। पिछले कुछ दिनों के लिए जब भी मैं सर्वर पर एक पुश करता हूं तो मुझे यह संदेश मिलता है: "इष्टतम प्रदर्शन के लिए रिपॉजिटरी को ऑटो पैकिंग", और यह शेल को वापस जाने और वापस जाने के लिए नहीं लगता है।

मैंने एक नई शाखा की जाँच करने का भी प्रयास किया और फिर अपनी पिछली शाखा पर एक रिबास किया और फिर git gcअप्रयुक्त इतिहास की वस्तुओं को हटाने के लिए किया और फिर एक धक्का दिया लेकिन फिर भी यह संदेश दिखाई देता है। कृपया मुझे बताएं कि मेरे रेपो के साथ क्या हो रहा है।

जवाबों:


305

लघु संस्करण: इसका मतलब है कि यह क्या कहता है, और यदि आप इसे खत्म करने देते हैं, तो सब ठीक हो जाएगा।

अधिकांश परिचालनों के दौरान, जो संभावित रूप से रिपॉजिटरी (पुश सहित) में ढीली (अनपैक्ड) वस्तुओं की संख्या में वृद्धि कर सकते हैं, गिट इनवॉइस git gc --auto। यदि पर्याप्त ढीली वस्तुएं हैं (डिफ़ॉल्ट रूप से, कम से कम 6700), तो यह git repack -d -lउन्हें पैक करने के लिए आह्वान करेगा । यदि बहुत सारे अलग-अलग पैक हैं, तो यह उन्हें एक में भी रिपीट करेगा।

एक पैक एक डेल्टा-संपीड़ित एकल फ़ाइल है, जिसमें बड़ी संख्या में ऑब्जेक्ट होते हैं। यह पैक में वस्तुओं को संग्रहीत करने के लिए अधिक कुशल है, लेकिन वस्तुओं को पैक करने (संपीड़ित) करने में समय लगता है, इसलिए Git शुरू में ढीली वस्तुओं का निर्माण करता है, फिर स्वचालित रूप से इनवॉइस के माध्यम से उन्हें बैचों में पैक करता है git gc --auto

यदि आप Git को फिर से तैयार करते हैं, तो यह कुछ समय के लिए फिर से नहीं होगा। यह वास्तव में थोड़ी देर ले सकता है, खासकर यदि आपके पास बहुत बड़ी बाइनरी ऑब्जेक्ट हैं, लेकिन अगर यह ट्रिगर हो रहा है, तो यह संकेत है कि यह संभवतः रेपो द्वारा ली गई डिस्क स्थान की मात्रा को काफी कम कर देगा। यदि आप वास्तव में ऐसा नहीं करना चाहते हैं, तो आप कॉन्फ़िगरेशन पैरामीटर को बदल सकते हैं gc.auto। यदि आप इसे 6700 से कुछ अधिक तक बढ़ाते हैं, तो यह कम बार घटित होगा, लेकिन जब ऐसा होता है तो अधिक समय लेते हैं। यदि आप इसे कम करते हैं, तो यह अभी भी आपके वर्तमान रीपैक को करना होगा, लेकिन बाद में यह अधिक बार होगा और अधिक तेज़ी से समाप्त होगा। यदि आप इसे 0 पर सेट करते हैं, तो यह स्वचालित रीपैकेजिंग को अक्षम कर देगा।

अधिक जानकारी के लिए देखें man git-gc(अंडर --auto) और man git-config(अंडर gc.auto)।


14
वास्तव में, मेरे लिए यह लगभग 5 मिनट का समय था, लेकिन यह खत्म हो गया। बहुत बढ़िया जवाब।
जोशुआ पिंटर

6
हम इसे हर धक्के के साथ होते हुए देख रहे हैं (कुछ सेकंड के लिए, हेह)।

2
@dpk: यह सामान्य परिस्थितियों में नहीं होना चाहिए - एक पुश में वस्तुओं की संख्या इतनी बड़ी नहीं होनी चाहिए कि इसे ट्रिगर किया जा सके (जब तक कि आपका भंडार बहुत बड़ा न हो और / या आप एक टन जोर लगा रहे हों), तो एक बार सफलतापूर्वक पूर्ण (आप इसे पूर्ण होने दे रहे हैं, ठीक है?) इसे फिर से तब तक नहीं होना चाहिए जब तक आप इसका निर्माण नहीं करते हैं। यदि आप इसका पता नहीं लगा सकते हैं, तो एक अलग प्रश्न पूछें।
Cascabel

6
"यदि आप गिट खत्म करते हैं", और यह कर सकते हैं ... fatal: Out of memory, malloc failed (tried to allocate 79610689 bytes) error: failed to run repack- यह वही है जो मुझे हमारे पूरे कोडबेस को एक गीगा रेपो में चिपकाने के लिए मिलता है। मुझे लगता है कि मैं क्षुधा को मारने और "मैन्युअल रूप से" को
रीपैक्स

11
मैं इसे हर बार प्राप्त कर रहा हूं मैं एक गिट पुल करता हूं। मैंने एक मैनुअल git gc किया है, लेकिन यह तब भी होता है जब भी मैं खींचता हूं। अजीब।
बैरी केली

51

जबकि Jefroni सही है कि कभी-कभी ऑटो-पैकिंग को पूरा करने के लिए समय की आवश्यकता होती है, अगर ऑटो-पैकिंग संदेश कई दिनों तक रहता है जैसा कि ओपी वर्णन करता है, एक अच्छा मौका है कि गिट की सफाई झूलने वाली वस्तुओं को याद कर रही है, जैसा कि इस प्रश्न में वर्णित है ।

यह देखने के लिए कि क्या झूलने वाली वस्तुएं ऑटो-पैकिंग के बारे में चल रहे संदेशों को ट्रिगर कर रही हैं, चलाने का प्रयास करें git fsck। यदि आपको झूलने की लंबी सूची मिलती है, तो आप उन्हें साफ कर सकते हैं

git gc --prune=now

मुझे आमतौर पर हर 2-3 महीने में इसे अपने रेपो पर चलाना होता है, जब ऑटो-पैकिंग संदेश एक पुल के बाद दूर नहीं जाता है।


5
जबकि स्वीकृत उत्तर नहीं, यह वही था जिसकी मुझे आवश्यकता थी। मुझे हर बार संदेश मिला कि मैंने git pullकई दिनों तक किया, और fsckवास्तव में एक टन झूलते हुए चित्र दिखाए।
जोर्न ज़ेफ़रेर

36

एक परियोजना के लिए अक्षम करने के लिए:

cd your_project_dir
git config gc.auto 0

विश्व स्तर पर अक्षम करने के लिए:

git config --global gc.auto 0

2
मुझे लगता है कि मुझे पता चला कि कैसे: .it फ़ोल्डर में जाएं, कॉन्फिग फ़ाइल खोलें, और 'ऑटो = 0' टेक्स्ट को हटाएं, और सहेजें। यह ऑटोपैकिंग को फिर से सक्षम करने के लिए लगता है।
एड्रियन कीस्टर

18
git config --unset gc.auto
jtatum

10

Git, git-repack चला रहा है, जो कई वस्तुओं (= फाइल, कमिट और ट्री) को एक पैक फाइल में पैक करता है। Git कभी-कभी ऐसा करता है, जब एक विधर्मी कहता है कि अंतरिक्ष को बचाया जा सकता है (एक पैक फ़ाइल में संकुचित ऑब्जेक्ट डेल्टास होता है, जबकि ऑब्जेक्ट / निर्देशिका में प्रत्येक फ़ाइल में संपीड़ित पूर्ण फ़ाइल सामग्री होती है)


2

उम्मीद है, वह git gc --autoकदम अब (git 2.0.1, 25 जून, 2014) अधिक कुशल है।
देखें 62aad18 प्रतिबद्ध द्वारा गुयेन थाई Ngọc Duy ( pclouds)

gc --auto: पृष्ठभूमि में refs को लॉक न करें

9f673f9 ( gc: बैकग्राउंड में --auto चलाने के लिए कॉन्फिगर का विकल्प - 2014-02-08, Git 2.0.0) gc --autoउपयोगकर्ता के प्रतीक्षा समय को कम करने के लिए बैकग्राउंड में " " डालता है ।
कचरा इकट्ठा करने का एक हिस्सा पैक-रिफ और प्रूनिंग रिफ्लक्स है। इसके लिए कुछ रेफरी को लॉक करने की आवश्यकता होती है और उसी रिफ़ को लॉक करने की कोशिश करने वाली अन्य प्रक्रियाओं को निरस्त कर सकते हैं।

यदि gc --autoकिसी स्क्रिप्ट के बीच में फायर किया जाता है, तो बैकग्राउंड में gc की होल्डिंग लॉक स्क्रिप्ट को विफल कर सकती है, जो 9f673f9 से पहले कभी नहीं हो सकती

समानांतर रेफरी अपडेट को रोकने के लिए अग्रभूमि में pack-refs"और" चालू रखें reflog --prune। शेष पृष्ठभूमि संचालन (रिपैक, प्रून और रीरे) को चलने वाली प्रक्रियाओं को प्रभावित नहीं करना चाहिए।

और Git 2.22 (Q2 2019) को और अनुकूलित करेंgit gc

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