"लंबे और सम्मिलित इतिहास" को आयात करने के बाद वह ठीक से ऐसा करने का सुझाव देता है
Date: Wed, 5 Dec 2007 22:09:12 -0800 (PST)
From: Linus Torvalds <torvalds at linux-foundation dot org>
To: Daniel Berlin <dberlin at dberlin dot org>
cc: David Miller <davem at davemloft dot net>,
ismail at pardus dot org dot tr,
gcc at gcc dot gnu dot org,
git at vger dot kernel dot org
Subject: Re: Git and GCC
In-Reply-To: <4aca3dc20712052111o730f6fb6h7a329ee811a70f28@mail.gmail.com>
Message-ID: <alpine.LFD.0.9999.0712052132450.13796@woody.linux-foundation.org>
References: <4aca3dc20712051947t5fbbb383ua1727c652eb25d7e@mail.gmail.com>
<20071205.202047.58135920.davem@davemloft.net>
<4aca3dc20712052032n521c344cla07a5df1f2c26cb8@mail.gmail.com>
<20071205.204848.227521641.davem@davemloft.net>
<4aca3dc20712052111o730f6fb6h7a329ee811a70f28@mail.gmail.com>
थू पर, 6 दिसंबर 2007, डैनियल बर्लिन ने लिखा:
वास्तव में, यह पता चला है कि git-gc --aggressive
यह डंबल फाइल को कभी-कभी फाइल पैक करने के लिए करता है चाहे आप एक SVN रेपो से परिवर्तित हो या नहीं।
पूर्ण रूप से। git --aggressive
ज्यादातर गूंगा है। यह वास्तव में केवल "मुझे पता है कि मेरे पास वास्तव में खराब पैक है के मामले के लिए उपयोगी है , और मैं उन सभी खराब पैकिंग को फेंकना चाहता हूं जो मैंने किया है।"
यह समझाने के लिए, यह समझाने योग्य है (आप शायद इसके बारे में जानते हैं, लेकिन मुझे मूल रूप से वैसे भी जाने दें) कैसे डेल्टा डेल्टा-चेन काम करते हैं, और वे अन्य प्रणालियों से कितने अलग हैं।
अन्य SCM में, एक डेल्टा-चेन आमतौर पर तय की जाती है। यह "आगे" या "पीछे की ओर" हो सकता है, और जब आप रिपॉजिटरी के साथ काम करते हैं तो यह थोड़ा सा विकसित हो सकता है, लेकिन आम तौर पर यह एकल SCM इकाई के रूप में प्रतिनिधित्व की गई एकल फ़ाइल में परिवर्तन की एक श्रृंखला है। सीवीएस में, यह स्पष्ट रूप से *,v
फ़ाइल है, और बहुत सारे अन्य सिस्टम समान चीजों को करते हैं।
गिट डेल्टा-चेन भी करते हैं, लेकिन यह उन्हें बहुत अधिक "शिथिल" करता है। कोई निश्चित इकाई नहीं है। डेल्टास किसी भी यादृच्छिक अन्य संस्करण के खिलाफ उत्पन्न होते हैं जो एक अच्छा डेल्टा उम्मीदवार (विभिन्न सफल उत्तराधिकारियों के साथ) होने के लिए देवता को मानते हैं, और बिल्कुल कठोर समूहन नियम नहीं हैं।
यह आम तौर पर एक बहुत अच्छी बात है। यह विभिन्न वैचारिक कारणों के लिए अच्छा है ( यानी , आंतरिक रूप से वास्तव में कभी भी पूरे संशोधन श्रृंखला के बारे में परवाह करने की आवश्यकता नहीं है - यह वास्तव में डेल्टास के संदर्भ में बिल्कुल भी नहीं सोचता है), लेकिन यह अनम्य डेल्टा नियमों से छुटकारा पाने के कारण बहुत अच्छा है उदाहरण के लिए दो फ़ाइलों को एक साथ मर्ज करने से उस git को कोई समस्या नहीं है - उदाहरण के लिए, कोई *,v
" मनमानी फ़ाइलें" नहीं हैं जिनमें कुछ छिपे हुए अर्थ हैं।
इसका अर्थ यह भी है कि डेल्टास का चुनाव अधिक खुला प्रश्न है। यदि आप डेल्टा श्रृंखला को केवल एक फ़ाइल तक सीमित करते हैं, तो आपके पास वास्तव में डेल्टास के बारे में बहुत सारे विकल्प नहीं हैं, लेकिन गिट में, यह वास्तव में एक पूरी तरह से अलग मुद्दा हो सकता है।
और यह वह जगह है जहां वास्तव में बुरी तरह से नाम --aggressive
आता है। जबकि गिट आम तौर पर डेल्टा जानकारी का फिर से उपयोग करने की कोशिश करता है (क्योंकि यह एक अच्छा विचार है, और यह सीपीयू समय बर्बाद नहीं करता है जो हम पहले पाए गए सभी अच्छे डेल्टाों को फिर से खोज रहे हैं), कभी-कभी आप कहना चाहते हैं "चलो एक खाली स्लेट के साथ सभी शुरू करते हैं, और पिछले सभी डेल्टा जानकारी को अनदेखा करते हैं, और डेल्टास का एक नया सेट उत्पन्न करने का प्रयास करते हैं।"
तो --aggressive
वास्तव में आक्रामक होने के बारे में नहीं है, लेकिन सीपीयू के समय को बर्बाद करने के बारे में एक निर्णय जो हम पहले ही कर चुके थे!
कभी-कभी यह अच्छी बात है। विशेष रूप से कुछ आयात उपकरण वास्तव में बहुत खराब डेल्टास उत्पन्न कर सकते हैं। git fast-import
उदाहरण के लिए, जो कुछ भी उपयोग करता है , उसके पास बहुत बड़ा डेल्टा लेआउट नहीं है, इसलिए यह कहने योग्य हो सकता है कि "मैं एक साफ स्लेट से शुरू करना चाहता हूं।"
लेकिन लगभग हमेशा, अन्य मामलों में, यह वास्तव में एक बहुत बुरा काम है। यह सीपीयू समय बर्बाद करने जा रहा है, और खासकर यदि आपने वास्तव में पहले डेल्टा में एक अच्छा काम किया था, तो अंतिम परिणाम उन सभी अच्छे डेल्टास का फिर से उपयोग करने वाला नहीं है जो आप पहले से ही पाए गए हैं, इसलिए आप वास्तव में बहुत कुछ खत्म करेंगे इससे भी बुरा परिणाम!
मैं सिर्फ git gc --aggressive
दस्तावेज निकालने के लिए जूनियो को एक पैच भेजूंगा । यह उपयोगी हो सकता है, लेकिन यह आम तौर पर केवल तभी उपयोगी होता है जब आप वास्तव में बहुत गहरे स्तर पर समझते हैं कि यह क्या कर रहा है, और यह प्रलेखन आपको ऐसा करने में मदद नहीं करता है।
आमतौर पर, वृद्धिशील git gc
करना सही दृष्टिकोण है, और करने से बेहतर है git gc --aggressive
। यह पुराने डेल्टास का फिर से उपयोग करने जा रहा है, और जब उन पुराने डेल्टास को नहीं पाया जा सकता है (पहली जगह में वृद्धिशील जीसी करने का कारण!) यह नया बनाने जा रहा है।
दूसरी ओर, यह निश्चित रूप से सच है कि एक "लंबे और सम्मिलित इतिहास का प्रारंभिक आयात" एक ऐसा बिंदु है जहां यह वास्तव में अच्छा डेल्टा खोजने में बहुत समय बिताने के लायक हो सकता है । फिर, प्रत्येक उपयोगकर्ता के बाद (जब तक वे git gc --aggressive
इसे पूर्ववत करने के लिए उपयोग नहीं करते !) को उस एक बार की घटना का लाभ मिलेगा। इसलिए विशेष रूप से एक लंबे इतिहास के साथ बड़ी परियोजनाओं के लिए, यह शायद कुछ अतिरिक्त काम करने के लायक है, डेल्टा खोजने के कोड को जंगली बताने के लिए।
तो समतुल्य git gc --aggressive
- लेकिन ठीक से किया हुआ - करना है (रात भर) कुछ ऐसा
git repack -a -d --depth=250 --window=250
जहां गहराई की बात बस इतनी ही है कि डेल्टा चेन कितनी गहरी हो सकती है (पुराने इतिहास के लिए उन्हें अधिक समय तक बनाये रखें - यह अंतरिक्ष के ऊपर के लायक है), और खिड़की की बात इस बारे में है कि हम प्रत्येक डेल्टा उम्मीदवार को स्कैन करने के लिए कितनी बड़ी वस्तु चाहते हैं।
और यहाँ, आप अच्छी तरह से -f
झंडे को जोड़ना चाहते हैं (जो कि "सभी पुराने डेल्टास को छोड़ दें", क्योंकि आप अब वास्तव में यह सुनिश्चित करने की कोशिश कर रहे हैं कि यह वास्तव में अच्छे उम्मीदवारों को ढूंढता है।
और फिर यह हमेशा के लिए ले जा रहा है और एक दिन ( यानी , "एक रात में यह काम करते हैं")। लेकिन अंतिम परिणाम यह है कि उस भंडार से प्रत्येक व्यक्ति को बहुत बेहतर पैक मिलेंगे, बिना उस पर कोई प्रयास किए।
Linus