2015-06-20 8 views
5

मैं स्क्वैश की कोशिश कर रहा हूं, कई एक ही में काम करते हैं, समस्या यह है कि मुझे लेखक (नाम या ईमेल) द्वारा ऐसा करने की ज़रूरत है।लेखक द्वारा गिट स्क्वाश - सभी लेखक एक ही प्रतिबद्धता में काम करते हैं

मामला:

चलें कहते हैं कि मैं एक शाखा कहा जाता है सुविधा एक, इस शाखा में मैं कई लेखकों के लिए कई करता है। मैं एक ही प्रतिबद्धता में लेखक (उदाहरण के लिए ईमेल) द्वारा सभी कामों को कैसे स्क्वैश कर सकता हूं। मैं चाहता हूं कि सभी लेखक मर्ज करने में सक्षम हों।

कोई मदद यहाँ?

अग्रिम

+0

ऐसा लगता है जैसे यह बहुत अनावश्यक प्रयास कर सकता है। यही है, अगर किसी विशेष लेखक द्वारा जारी किया जाता है तो लगातार नहीं होते हैं, तो उन्हें स्क्वैश करने के लिए बहुत सारे मैन्युअल हस्तक्षेप की आवश्यकता होती है। आप अपने कई लेखकों को अपनी शाखा में प्रत्येक काम करने से बेहतर होगा। – larsks

उत्तर

1

Be careful rewriting history

अंत में धन्यवाद परिणाम आप संभव हो सकता है चाहते हैं, तो आप प्रत्येक लेखक के लिए शाखाओं बनाने के लिए, cherry-pick सही शाखा में प्रत्येक लेखक की ओर से कमिट, फिर उन परिवर्तनों को छुटकारा पाने। हालांकि, मुझे नहीं लगता कि यह काम करेगा यदि ये अर्थपूर्ण रूप से एक-दूसरे पर निर्भर करते हैं।

आप प्रतिबद्ध की एक श्रृंखला है, तो:

  Author1    Author2    Author1 
version1 ---commit---> version2 ---commit---> version3 ---commit--->... 

आप Author2 से परिवर्तन को निकालने के लिए प्रयास करें, और version1 करने के लिए उन्हें लागू करने के लिए थे, तो वहाँ एक अच्छा मौका है यह मतलब नहीं होगा (उदाहरण के लिए , अगर लेखक 2 कोड को संशोधित करता है जो लेखक 1 बनाया गया है)।

1

Kenkron 'मन में रों caveats साथ, आप एक कर सकता है:

SORTED_GIT_LOGS=$(git log --pretty="format:%an %H" master..feature_a | sort -g | cut -d' ' -f2); \ 
IFS=$(echo -en "\n\b"); for LOG in $SORTED_GIT_LOGS; do \ 
    git cherry-pick $LOG; \ 
done | less 

git log --pretty="format:%an %H" master..feature_a | sort -gfeature_a प्रतिबद्ध (नहीं master से master..feature_a वाक्य रचना की वजह से लोगों को)

के लॉग को सॉर्ट होगा आपको अभी भी master पर स्क्वैश (अब लेखक द्वारा आदेश दिया गया) स्क्वैश करने के लिए एक इंटरैक्टिव रीबेस करने की आवश्यकता होगी।

+0

इंटरैक्टिव रीबेज का उदाहरण: http://denniskubes.com/2012/08/22/honey-i-quashed-the-commits/ – VonC

+0

अगर लेखक द्वारा किया जाता है, तो 'गिट रीसेट' भी काम कर सकता है: http: // makandracards .com/makandra/527-squash-many-git-commits-in-a-single-commit – VonC

1

मैं एक अनावश्यक रूप से विशाल भंडार पर एक समान फिर से लिखने के लिए है, जबकि रेपो ऑफ़लाइन था की जरूरत है। दृष्टिकोण मैं ले लिया प्रयास करने से स्वचालित था 'इंटरैक्टिव' 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 मिनट लग गई।

+0

दिलचस्प दृष्टिकोण, मेरे उत्तर से अधिक पूर्ण। +1। यद्यपि आपकी 'रख-रखाव' समस्या के बारे में निश्चित नहीं है। – VonC

+0

इतिहास को फिर से लिखने के लिए किसी भी समय ध्यान देने योग्य है, यदि आप नहीं चाहते हैं कि पुनर्लेखन प्रक्रिया प्रत्येक प्रतिबद्धता के लिए कमेंटर के रूप में स्वयं को (पुनःलेखक) विशेषता दे, तो आपको शायद कमेंटर को रीसेट करके पुनः लिखना होगा। सबसे आसान तरीका है [कम्यूटर = लेखक] [https://stackoverflow.com/a/32944640/5037965), लेकिन मूल कम्यूटर जानकारी वास्तव में महत्वपूर्ण थी और इसे बनाए रखने की आवश्यकता होने पर एक और विस्तृत दृष्टिकोण की आवश्यकता होगी। –

+0

मैंने https://gist.github.com/jayvdb/9b41677f00065dbd94cc02446fc5ba34 को एक स्क्रिप्ट 'जेनरेट-मल्टी-न्यू-फाइल-स्क्वैश.श'' में जोड़ा है जो कि लगातार जोड़ों में शामिल होते हैं (यानी कमिटर ने गिटहब/गिटलैब/बिटबकेट वेब यूआई "अपलोड फाइल") –

संबंधित मुद्दे