के साथ बहुत सारे इतिहास के साथ मेरे पास नवीनतम संशोधन में लगभग 3500 प्रतिबद्धताओं और 30,000 विशिष्ट फ़ाइलों के साथ एक गिट भंडार है। यह कई लोगों से लगभग 3 वर्षों का काम प्रस्तुत करता है और हमें इसे सभी खुले स्रोत बनाने की अनुमति प्राप्त हुई है। मैं सिर्फ नवीनतम संस्करण की बजाय पूरे इतिहास को रिलीज़ करने के लिए कड़ी मेहनत कर रहा हूं। ऐसा करने के लिए मुझे "समय पर वापस जाना" और फ़ाइलों के शीर्ष पर लाइसेंस शीर्षलेख डालने में दिलचस्पी है जब वे बनाए जाते हैं। मेरे पास वास्तव में यह काम कर रहा है, लेकिन इसमें लगभग 3 दिन पूरी तरह से रैमडिस्क से बाहर चलते हैं, और अभी भी मैन्युअल हस्तक्षेप की आवश्यकता होती है। मुझे पता है कि यह बहुत तेज़ हो सकता है, लेकिन मेरा गिट-फू कार्य तक काफी नहीं है।कुशलतापूर्वक पुनर्लेखन (rebase -i) गिट
प्रश्न: मैं एक ही चीज़ को बहुत तेज़ी से कैसे पूरा कर सकता हूं?
क्या मैं वर्तमान में है (एक स्क्रिप्ट में स्वचालित है, लेकिन मेरे साथ सहन कृपया ...):
पहचानें प्रतिबद्ध जहां एक नई फ़ाइल भंडार में जोड़ा गया था के सभी (वहाँ सिर्फ शर्मीले होते हैं इनमें से 500, Fwiw) का:
git whatchanged --diff-filter=A --format=oneline
परिभाषित वातावरण चर GIT_EDITOR अपने ही स्क्रिप्ट फ़ाइल की पहली पंक्ति पर
edit
केवल एक ही समय के साथpick
की जगह होने के लिए (आप क्यों शीघ्र ही देखेंगे)। इस आपरेशन की मूल है:perl -pi -e 's/pick/edit/ if $. == 1' $1
प्रत्येक के लिए ऊपर
git whatchanged
के उत्पादन से प्रतिबद्ध, शुरू करने के लिए एक इंटरैक्टिव रिबेस आह्वान बस से पहले प्रतिबद्ध है कि फाइल कहा:git rebase -i decafbad001badc0da0000~1
मेरा कस्टम GIT_EDITOR (वह पर्ल एक-लाइनर) pick
से edit
में बदलता है और हमें नई फ़ाइल में परिवर्तन करने के लिए एक खोल में गिरा दिया जाता है। एक और सरल header-inserter
स्क्रिप्ट हेडर में एक ज्ञात अद्वितीय पैटर्न की तलाश करता है जिसे मैं सम्मिलित करने का प्रयास कर रहा हूं (केवल मेरे लिए ज्ञात फ़ाइल प्रकारों (*। [ChS] में))। यदि यह वहां नहीं है, तो यह फ़ाइल डालता है, और git add
फ़ाइल है। इस निष्पक्ष तकनीक का कोई ज्ञान नहीं है कि वर्तमान प्रतिबद्धताओं के दौरान वास्तव में कौन सी फाइलें शामिल की गई थीं, लेकिन यह सही चीज करने और बेवकूफ होने (एक ही फाइल के खिलाफ कई बार चलाने के लिए सुरक्षित) समाप्त होती है, और यह नहीं है कि यह पूरी प्रक्रिया किसी भी तरह से बाधित है ।
इस बिंदु पर हम खुश हमने अपडेट कर दिया वर्तमान प्रतिबद्ध है, और आह्वान है कि कर रहे हैं:
git commit --amend
git rebase --continue
rebase --continue
महंगा हिस्सा है। चूंकि हम whatchanged
के आउटपुट में प्रत्येक संशोधन के लिए एक बार git rebase -i
का आह्वान करते हैं, यह बहुत अधिक रिबेजिंग है। लगभग हर समय जब इस स्क्रिप्ट को चलाता है तो "रिबेसिंग (2345/2733)" काउंटर वृद्धि को देखकर खर्च किया जाता है।
यह भी धीमा नहीं है। समय-समय पर संघर्ष होते हैं जिन्हें संबोधित किया जाना चाहिए। यह कम से कम इन मामलों में हो सकता है (लेकिन अधिक संभावना है): (1) जब एक "नई" फ़ाइल वास्तव में मौजूदा फाइल की एक प्रति होती है जिसमें इसकी पहली पंक्तियों में कुछ बदलाव किए जाते हैं (उदाहरण के लिए, #include
कथन)। यह एक वास्तविक संघर्ष है लेकिन ज्यादातर मामलों में स्वचालित रूप से हल किया जा सकता है (हाँ, एक स्क्रिप्ट है जो उससे संबंधित है)। (2) जब एक फ़ाइल हटा दी जाती है। यह केवल पुष्टि करके कि यह git rm
के साथ इसे हटाना चाहता है, यह छोटा रूप से हल करने योग्य है। (3) ऐसे कुछ स्थान हैं जहां ऐसा लगता है कि diff
बस बुरी तरह व्यवहार करता है, उदाहरण के लिए, जहां परिवर्तन केवल खाली रेखा का जोड़ है।अन्य वैध विवादों के लिए मैन्युअल हस्तक्षेप की आवश्यकता होती है लेकिन पूरी तरह से वे सबसे बड़ी बाधा नहीं हैं। सबसे बड़ी बाधा बिल्कुल "बसने (xxxx/yyyy)" पर देखकर बस बैठी है।
अभी व्यक्तिगत विवादों को नए कामों से पुराने कामों में शुरू किया जाता है, यानी, git whatchanged
के आउटपुट के शीर्ष से शुरू होता है। इसका मतलब है कि पहली बार पुनर्जन्म कल के कामों को प्रभावित करता है, और अंत में हम 3 साल पहले से रिबिटिंग करेंगे। "नए" से "पुराने" तक जाकर काउंटर-अंतर्ज्ञानी लगता है, लेकिन अब तक मुझे विश्वास नहीं है कि जब तक हम रीबेस का आह्वान करते हैं तो हम pick
को edit
में बदलते हैं। मुझे ऐसा करने से डर है क्योंकि संघर्ष आते हैं, और मैं संघर्ष में लहरों की एक ज्वारीय लहर से निपटना नहीं चाहता हूं, जो कि एक ही समय में सबकुछ चुकाने की कोशिश कर रहा है। शायद किसी से बचने के लिए कोई रास्ता जानता है? मैं एक के साथ आने में सक्षम नहीं हूँ।
मैंने गिट ऑब्जेक्ट्स 1 की आंतरिक कार्यप्रणाली को देखना शुरू कर दिया! ऐसा लगता है कि ऑब्जेक्ट ग्राफ़ को चलाने के लिए और अधिक कुशल तरीका होना चाहिए और केवल उन परिवर्तनों को बनाना चाहिए जिन्हें मैं बनाना चाहता हूं।
कृपया ध्यान दें कि इस भंडार जहां हम प्रभावी रूप से टैग या शाखाओं में से कोई फायदा नहीं बना एक SVN भंडार से आया है (मैं पहले से ही git filter-branch
उन्हें दूर एड), तो हम एक सरल-रेखा इतिहास की सुविधा है। कोई गिट शाखा या विलय नहीं।
मुझे यकीन है कि मैंने कुछ महत्वपूर्ण जानकारी छोड़ी है, लेकिन यह पोस्ट पहले से ही बहुत लंबा लगता है। अनुरोध के रूप में अधिक जानकारी प्रदान करने के लिए मैं अपनी पूरी कोशिश करूंगा। अंत में मुझे अपनी विभिन्न स्क्रिप्ट प्रकाशित करने की आवश्यकता हो सकती है, जो एक संभावना है। यह जानना मेरा उद्देश्य है कि इतिहास को एक गिट भंडार में कैसे लिखना है; लाइसेंसिंग और कोड रिलीज के अन्य व्यवहार्य तरीकों पर बहस न करें।
धन्यवाद!
अपडेट 2012-06-17: Blog post सभी गोरी विवरणों के साथ।
यह मेरे लिए बहुत अस्पष्ट है, मैं एक बड़े पैमाने पर इतिहास फिर से लिखने के लिए आवश्यक कभी नहीं, लेकिन मैं पता है कि ऐसा करने के लिए सही उपकरण है ['गिट फ़िल्टर-शाखा'] (http://www.kernel.org/pub/software/scm/git/docs/v1.7.3/git-filter-branch.html) । मुझे खेद है कि मैं और अधिक सहायक नहीं हो सकता, मुझे उम्मीद है कि यह आपको ट्रैक पर ले जाएगा। – KurzedMetal
@ कुर्ज़ेड मेटल: मैंने इस रिलीज के लिए अप्रासंगिक थे (फाइल सिस्टम) पथ को खत्म करने के लिए इस सभी रिबेजिंग को शुरू करने से पहले 'फ़िल्टर-शाखा' का उपयोग किया था। (एसवीएन भंडार जिस से इस गिट भंडार का निर्माण किया गया था, वह भी बड़ा और अधिक अपर्याप्त है।) हालांकि, आपके पास एक बिंदु हो सकता है कि 'फिल्टर-शाखा' के दौरान किए जाने वाले स्क्रिप्टिंग परिवर्तन इस सभी रिबेजिंग करने से अधिक कुशल हो सकते हैं। मैं जांच करूंगा। – jonny0x5
'यह कई लोगों से लगभग 3 साल का काम प्रस्तुत करता है और हमें इसे सभी खुले स्रोत बनाने की अनुमति प्राप्त हुई है, मुझे पता है कि यह विषय है, लेकिन मैं उत्सुक हूं: पी, परियोजना का नाम/मुखपृष्ठ क्या है? – KurzedMetal