如何以非交互方式运行git rebase –interactive?
是否有可能做到以下几点?
- 使git rebase --interactive只输出标准样板文件,而不是输出到文件,并在编辑器中打开它。
- 让用户编辑文件。
-  让用户用编辑文件的名称重新运行git rebase。
- 继续平常的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不在这个脚本的范围之内。