如何以非交互方式运行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不在这个脚本的范围之内。