2012-09-12 8 views
31

क्या यह निम्नलिखित करना संभव है?मैं गैर-संवादात्मक तरीके से गिट रिबेस - इंटरैक्टिव कैसे चला सकता हूं?

  1. बनाओ git rebase --interactive एक फाइल करने के लिए सिर्फ उत्पादन मानक बॉयलरप्लेट, बजाय एक फ़ाइल और संपादक में खोलने के लिए outputting के लिए करने के लिए।
  2. उपयोगकर्ता को फ़ाइल संपादित करने दें।
  3. उपयोगकर्ता को संपादित फ़ाइल के नाम से git rebase दोबारा चलाने दें।
  4. सामान्य रीबेस प्रक्रिया के साथ आगे बढ़ें।

उपयोग: पाठ्यक्रम की पटकथा पुन: प्रतिक्रिया। उदाहरण के लिए how to re-order commits in Git non-interactively देखें।

+0

http://stackoverflow.com/questions/12270357/really-flatten-a-git-merge देखें जहां यह उपयोगी भी होगा। – pfalcon

+0

नीचे गिट रिबेस के अलावा, गिट फ़िल्टर-शाखा एक और विकल्प है: http://stackoverflow.com/questions/19636750/git-filter-branch-msg-filter-to-reword-a-pushed-commit-message – MarcH

उत्तर

41

कुछ सोच और शोध के बाद, उत्तर छोटा हो गया: git rebase -i प्रसिद्ध संपादक/दृश्य पर्यावरण चर से संपादक का नाम लेता है, इसलिए एक गैर-इंटरैक्टिव स्क्रिप्ट को इंगित करने के लिए ओवरराइड करना नौकरी करता है।

हालांकि, संपादक/दृश्य, प्रतिबद्धताओं की सूची में उदासीनता से लागू होता है, फिर से रिकॉर्डिंग करते समय संदेश भेजता है और कुछ भी। इसलिए, http://git.kernel.org/?p=git/git.git;a=commit;h=821881d88d3012a64a52ece9a8c2571ca00c35cd के बाद, एक विशेष पर्यावरण चर GIT_SEQUENCE_EDITOR है जो केवल प्रतिबद्ध सूची पर लागू होता है।

तो, पुनः आदेश देने के नुस्खा या प्रतिबद्ध समतल है:

रन: GIT_SEQUENCE_EDITOR=<script> git rebase -i <params>। आपके <script> को एक भी तर्क स्वीकार करना चाहिए: मानक रीबेज प्रतिबद्ध सूची वाली फ़ाइल का पथ। इसे जगह में फिर से लिखना चाहिए और बाहर निकलना चाहिए। इसके बाद सामान्य रिबेस प्रक्रिया होती है।

+0

नहीं था 'GIT_SEQUENCE_EDITOR' के बारे में पता है, उपयोगी लगता है;) – c00kiemon5ter

+2

या, इस एकमात्र उद्देश्य के लिए एक स्क्रिप्ट बनाने के बजाय, मौजूदा कमांड 'सत्य' का उपयोग करें, जो कि किसी भी तर्क को अनदेखा करता है और' 0' का एक निश्चित रिटर्न कोड है। –

+3

@me_and यह केवल तभी मदद करता है जब आप वास्तव में काम करने के बिना 'रीबेज -आई' करना चाहते हैं। –

2

इंटरैक्टिव मोड सेट संपादक को साथ काम करने के लिए लाता है।
उपयोग में संपादक के साथ प्राप्त किया जा सकता है:

git config --get core.editor 

इसलिए, यदि आप एक गैर-सहभागी संपादक सेट - कि एक संपादक है कि stdin पर आदेशों को स्वीकार करता है, तो आप एक गैर में --interactive साथ काम कर सकते -इंटरएक्टिव रास्ता :)
मुझे यकीन है कि vim आदेश स्वीकार करता है, और मानक संपादकed, संभोग करता है।

हां, तो .. इंटरैक्टिव संपादक पकड़ (यदि चाहता था)

$ ied="$(git config --get core.editor)" 

गैर-सहभागी संपादक

$ git config --unset-all core.editor 
$ git config --add core.editor ed 

की स्थापना की और इसके साथ काम करते

$ printf '%s\n' "some-ed-cmd" "another-ed-cmd" "wq" | git rebase -i HEAD~5 

और बहाल संपादक (अगर चाहता था)

$ git config --unset-all core.editor 
$ git config --add core.editor "$ied" 
+0

धन्यवाद, हमने शायद इसी समय उत्तर लिखना शुरू कर दिया है, मैंने अपना पोस्ट करने से पहले मुझे नहीं देखा ;-) – pfalcon

+0

मुझे लगता है कि प्रति सत्र या प्रति-आदेश आधार पर, संपादक को दोबारा परिभाषित करना आसान है। – MarcH

+1

मैं दृढ़ता से 'git config --unset-all' करने के लिए सलाह देता हूं या जो भी स्क्रिप्ट में उपयोगकर्ता की कॉन्फ़िगरेशन फ़ाइल को संशोधित कर सकता है। एक कमांड के लिए एक गिट कॉन्फ़िगरेशन चर सेट करने के लिए, 'git -c var = val' का उपयोग करें, और इस मामले में' EDITOR 'सेटिंग बहुत आसान है। यह एक पर्यावरण चर है, इसलिए केवल वर्तमान प्रक्रिया पर लागू होता है, यह अन्य प्रक्रियाओं को परेशान नहीं करेगा या डिस्क पर कुछ भी लिख नहीं पाएगा। –

4

@ pfalcon के उत्तर में जोड़ना, आप sed को अपने GIT_SEQUENCE_EDITOR के रूप में उपयोग कर सकते हैं।उदाहरण के लिए, मैं एक प्रतिबद्ध संपादित करने के लिए चाहता था, इसलिए मैं इस किया था:

GIT_SEQUENCE_EDITOR="sed -i -re 's/^pick /e /'" git rebase -i 
4

मैं इस स्क्रिप्ट का उपयोग (में जोड़ने यह बंटवारे के लिए प्रतिबद्ध आसान बनाने के लिए अनुमति देता है):

#!/bin/bash 

ACTION=$1 
COMMIT=$(git rev-parse --short $2) 
[[ "$COMMIT" ]] || exit 1 
CORRECT= 
for A in p pick r reword e edit s squash f fixup x exec d delete t split; do 
    [[ $ACTION == $A ]] && CORRECT=1 
done 
[[ "$CORRECT" ]] || exit 1 
if [[ $ACTION == "delete" || $ACTION == "d" ]]; then 
    GIT_SEQUENCE_EDITOR="sed -i -e '/^pick $COMMIT/d'" git rebase -i $COMMIT^^ 
elif [[ $ACTION == "split" || $ACTION == "t" ]]; then 
    GIT_SEQUENCE_EDITOR="sed -i -e 's/^pick $COMMIT/edit $COMMIT/'" git rebase -i $COMMIT^^ || exit 1 
    git reset --soft HEAD^ 
    echo "Hints:" 
    echo " Select files to be commited using 'git reset', 'git add' or 'git add -p'" 
    echo " Commit using 'git commit -c $COMMIT'" 
    echo " Finish with 'git rebase --continue'" 
else 
    GIT_SEQUENCE_EDITOR="sed -i -e 's/^pick $COMMIT/$1 $COMMIT/'" git rebase -i $COMMIT^^ 
fi 

अपने लिए एक अन्य नाम जोड़ें। gitconfig:

[alias] 
    autorebase = ! path_to_your_script 
5

pfalcon के जवाब पर विस्तार:

रन GIT_SEQUENCE_EDITOR=<script> git rebase -i <params><script> को एकल तर्क स्वीकार करना चाहिए - मानक रीबेज प्रतिबद्ध सूची वाली फ़ाइल के पथ। लिपि को इसे जगह में फिर से लिखना चाहिए और बाहर निकलना चाहिए। इसके बाद सामान्य रिबेस प्रक्रिया होती है। आप एक वातावरण चर कि सामग्री शामिल है, तो

आप चाहते हैं:

GIT_SEQUENCE_EDITOR='echo "$REBASE_DATA" >' git rebase -i [<additional params>] 

एक फ़ाइल Catting भी काम करेगा:

GIT_SEQUENCE_EDITOR='cat rebase_data_file >' git rebase -i [<additional params>] 
2

आप संपादक जो स्पर्श करेगा के रूप में उपयोग कर सकते हैं touch फ़ाइल तो यह संशोधित दिखाई देगा। उदाहरण के लिए

GIT_SEQUENCE_EDITOR=touch git rebase -i [commit] 

यह अन्य नाम पर, एक टैग मैं

git config alias.baseline '!GIT_SEQUENCE_EDITOR=touch git rebase -i baseline' 

उर्फ ​​Windows के तहत काम करता है क्योंकि खोल यह निष्पादित हो रहा है bash नहीं cmd है के खिलाफ rebase करना चाहते हैं के रूप में baseline दिया।

+0

यह 'git --interactive --exec 'के साथ अच्छी तरह से काम करता है। मैंने '' को एक कमांड पर सेट किया है जो मेरी शाखा द्वारा पेश किए गए या संशोधित परीक्षण चलाता है, और '' 'मास्टर' पर चला जाता है। इससे गिट को शाखा में प्रत्येक प्रतिबद्धता के खिलाफ अपने परीक्षण चलाने का कारण बनता है। – Mike

0

पर Jezz's answer आधार पर, मैं एक खोल-अज्ञेयवाद लिपि (GitReb) जो बहु-तर्क संशोधन के साथ काम करता है, :/<text> वाक्य रचना, रूट प्रतिबद्ध और भी कुछ विवेक चेकों करता है बनाया है।

मैं भी यह आसान बना और t/split कार्रवाई और delete हटाया ->drop रूपांतरण जो IMO इस स्क्रिप्ट के दायरे से बाहर हैं।

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