मैं एक अनावश्यक रूप से विशाल भंडार पर एक समान फिर से लिखने के लिए है, जबकि रेपो ऑफ़लाइन था की जरूरत है। दृष्टिकोण मैं ले लिया प्रयास करने से स्वचालित था 'इंटरैक्टिव' GIT_SEQUENCE_EDITOR
जो @ द्वारा जेम्स-foucar this answer में कवर किया जाता है & @pfalcon का उपयोग कर rebase।
यह अच्छी तरह से काम करने के लिए, मैं इसे बेहतर पहले फिर से लिखा जा रहा है इतिहास की धारा से मर्ज निकालें पाया। मेरे अपने मामले के लिए, यह git rebase --onto
का उपयोग करके किया गया था जो स्टैक ओवरव्लो पर अन्य प्रश्नों में काफी हद तक कवर किया गया है।
मैं एक small script generate-similiar-commit-squashes.sh
बनाया pick
& squash
आदेशों ताकि लगातार समान प्रतिबद्ध कुचल दिया जाएगा उत्पन्न करने के लिए। मैंने इसी तरह के काम से मेल खाने के लिए लेखक-डेट-एंड-शॉर्टॉग का उपयोग किया, लेकिन आपको केवल लेखक की आवश्यकता है (मेरे गिस्ट के पास यह टिप्पणी है कि इसे केवल लेखक पर कैसे बनाया जाए)।
$ generate-similiar-commit-squashes.sh > /tmp/git-rebase-todo-list
उत्पादन
तरह
...
pick aaff1c556004539a54a7a33ce2fb859af0c4238c [email protected]
squash aa190ea2323ece42f1cd212041bf61b94d751d5c [email protected]
pick aab8c98981a8d824d2bc0d5278d59bc1a22cc7b0 [email protected]_config.yml
भंडार भी से भरा था एक ही शैली 'अद्यतन xyz' संदेशों के लिए प्रतिबद्ध के साथ आत्म वापस लग रहा है। जब squashed, वे खाली काम करता है।
जो मजदूर मैं विलय कर रहा था वह समान प्रतिबद्ध संदेश था। git rebase -i
संलग्न सभी स्क्वैश किए गए प्रतिबद्ध संदेशों के साथ एक संशोधित प्रतिबद्ध संदेश प्रदान करता है, जो दोहराया गया होता। इसे संबोधित करने के लिए, द्वारा दिए गए प्रतिबद्ध संदेश से डुप्लिकेट लाइनों को हटाने के लिए मैंने this answer से एक छोटी पर्ल स्क्रिप्ट का उपयोग किया। यह एक फ़ाइल में बेहतर है, क्योंकि इसका उपयोग शैल चर में किया जाएगा।
$ echo 'print if ! $x{$_}++' > /tmp/strip-seen-lines.pl
अंतिम चरण के लिए अब:
$ GIT_EDITOR='perl -i -n -f /tmp/strip-seen-lines.pl ' \
GIT_SEQUENCE_EDITOR='cat /tmp/git-rebase-todo-list >' \
git rebase --keep-empty -i $(git rev-list --max-parents=0 HEAD)
--keep-empty
का उपयोग कर के बावजूद, git
खाली प्रतिबद्ध के बारे में इस प्रक्रिया के द्वारा कई बार शिकायत की। यह मुझे अपूर्ण git rebase
के साथ कंसोल पर डंप कर देगा। खाली प्रतिबद्धता को फिर से शुरू करने और प्रसंस्करण फिर से शुरू करने के लिए, निम्नलिखित दो आदेशों की आवश्यकता थी (बल्कि अक्सर मेरे मामले में)।
$ git reset HEAD^
$ GIT_EDITOR='perl -i -n -f /tmp/strip-seen-lines.pl ' git rebase --continue
फिर --keep-empty
के बावजूद, मैं मैं अंतिम Git इतिहास में had no empty commits तो फिर सेट करता है ऊपर उन सब को हटा दिया था पाया,। मुझे लगता है कि मेरे गिट, संस्करण 2.14.1 के साथ कुछ गलत है। प्रोसेसिंग ~ 10000 इस तरह की प्रतिबद्धता एक क्रैपी लैपटॉप पर सिर्फ 10 मिनट लग गई।
ऐसा लगता है जैसे यह बहुत अनावश्यक प्रयास कर सकता है। यही है, अगर किसी विशेष लेखक द्वारा जारी किया जाता है तो लगातार नहीं होते हैं, तो उन्हें स्क्वैश करने के लिए बहुत सारे मैन्युअल हस्तक्षेप की आवश्यकता होती है। आप अपने कई लेखकों को अपनी शाखा में प्रत्येक काम करने से बेहतर होगा। – larsks