如何以非交互方式运行git rebase –interactive?

是否有可能做到以下几点?

  1. 使git rebase --interactive只输出标准样板文件,而不是输出到文件,并在编辑器中打开它。
  2. 让用户编辑文件。
  3. 让用户用编辑文件的名称重新运行git rebase
  4. 继续平常的rebase进程。

用例:当然是脚本重新装订。 看看如何在Git中非交互地重新提交提交 。

经过一番思考和研究之后,答案变得微不足道: git rebase -i采用了众所周知的EDITOR / VISUAL环境variables中的编辑器名称,所以重写指向非交互式脚本即可完成这项工作。

然而,EDITOR / VISUAL对于提交列表应用无所谓,改写时提交消息等等。 因此,自http://git.kernel.org/?p=git​​/git.git;a=commit;h=821881d88d3012a64a52ece9a8c2571ca00c35cd ,有一个特殊的环境variablesGIT_SEQUENCE_EDITOR只适用于提交列表。

所以,重新sorting或压扁提交的方法是:

运行: GIT_SEQUENCE_EDITOR=<script> git rebase -i <params> 。 你的<script>应该接受一个参数:包含标准rebase提交列表的文件的path。 它应该重写它并退出。 通常的rebase处理发生在那之后。

扩大pfalcon的答案:

运行GIT_SEQUENCE_EDITOR=<script> git rebase -i <params><script>应接受单个参数 – 包含标准rebase提交列表的文件的path。 脚本应该重写它并退出。 通常的rebase处理发生在那之后。

如果您有一个包含所需内容的环境variables:

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

捕获一个文件也可以工作:

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

我使用这个脚本(添加它允许简化提交拆分):

 #!/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 

添加到@ pfalcon的答案,您可以使用sed作为您的GIT_SEQUENCE_EDITOR。 例如,我想编辑每个提交,所以我这样做:

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

交互模式带来的设置编辑器工作。
正在使用的编辑器可以被检索:

 git config --get core.editor 

所以,如果你设置了一个非交互式的编辑器 – 这是一个接受stdin的命令的编辑器,你可以用非交互式的方式处理--interactive
我知道vim肯定会接受命令, 标准编辑也是这样。

所以,拿着交互式编辑器(如果想要的话)

 $ 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" 

你可以使用touch作为编辑器来触摸文件,使其看起来被修改。 例如

 GIT_SEQUENCE_EDITOR=touch git rebase -i [commit] 

给别名,给定baseline作为标签,我想rebase反对

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

别名在Windows下工作,因为它正在执行的shell是bash而不是cmd

根据Jezz的回答 ,我制作了一个不受 shell 规范影响的脚本( GitReb ),该脚本使用了多重参数修订:/<text>语法,根提交以及一些完整性检查。

我也简化了它,并删除了t / split动作,并delete – > drop转换,IMO不在这个脚本的范围之内。