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

pfa*_*con 41 git scripting git-rebase non-interactive

可以做以下吗?

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

用例:当然是脚本式的变基.例如,请参阅如何以非交互方式在Git中重新提交提交.

pfa*_*con 53

经过一些思考和研究后,答案变得微不足道:git rebase -i从着名的EDITOR/VISUAL环境变量获取编辑器名称,因此覆盖指向非交互式脚本的工作就完成了.

但是,EDITOR/VISUAL对提交列表无关紧要,在重写时提交消息等等.因此,自http://git.kernel.org/?p=git​​/git.git;a=commit;h=821881d88d3012a64a52ece9a8c2571ca00c35cd以来,有一个特殊的环境变量GIT_SEQUENCE_EDITOR,它仅适用于提交列表.

因此,重新订购或扁平提交的方法是:

跑:GIT_SEQUENCE_EDITOR=<script> git rebase -i <params>.您<script>应该接受一个参数:包含标准rebase提交列表的文件的路径.它应该就地重写并退出.之后通常会进行rebase处理.

  • 这是修复最后五个提交消息中的拼写错误的另一个例子:`EDITOR ="sed -i -e's/borken/broken/g'"GIT_SEQUENCE_EDITOR ="sed -i -e's/pick/reword/g '"git rebase -i HEAD~5` (7认同)
  • @me_and这只有在你想要`rebase -i`而不实际重新排序提交时才有用. (4认同)
  • 或者,不是为此唯一目的创建脚本,而是使用现有的命令`true`,它忽略任何参数并具有固定的返回码'0`. (2认同)
  • 由于某些未知原因,git --version 2.5.5现在忽略了EDITOR。另一方面,VISUAL仍然有效。因此,这是另一个示例,它重新生成了最后5个Change-Id。假定已安装Gerrit提交挂钩。`VISUAL =“ sed -i -e'/ ^ [[:空白:]] * Change-Id / d'” GIT_SEQUENCE_EDITOR =“ sed -i -e's / pick / reword / g'” git rebase -i HEAD 〜5`。使用git 2.5.5版成功测试 (2认同)
  • 我发现[VISUAL]在[自动git rebase]尝试中也没有起作用(/sf/ask/2166434721/ commit / 46403701#46403701),但是`GIT_EDITOR`起作用了。 (2认同)

Lei*_*and 9

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

GIT_SEQUENCE_EDITOR="sed -i -re 's/^pick /e /'" git rebase -i
Run Code Online (Sandbox Code Playgroud)


小智 7

扩展pfalcon的答案:

GIT_SEQUENCE_EDITOR=<script> git rebase -i <params>.<script>应该接受单个参数 - 包含标准rebase提交列表的文件路径.脚本应该就地重写并退出.之后通常会进行rebase处理.

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

GIT_SEQUENCE_EDITOR='echo "$REBASE_DATA" >' git rebase -i [<additional params>]
Run Code Online (Sandbox Code Playgroud)

捕获文件也会起作用:

GIT_SEQUENCE_EDITOR='cat rebase_data_file >' git rebase -i [<additional params>]
Run Code Online (Sandbox Code Playgroud)


Cer*_*vEd 7

要完全按照原始问题的要求进行操作,请使用sed -i '1s/^/b\n/'as 你的编辑器

git -c sequence.editor="sed -i '1s/^/b\n/'" rebase --interactive
Run Code Online (Sandbox Code Playgroud)

解释

  • git -c指定使用指定设置运行以下 git 命令
  • sequence.editor确定将编辑 redbase-todo 文件的“编辑器”的设置
  • sed -i就地运行 sed 命令
    • 1s在第一行
    • ^匹配开头
    • b\n插入b和换行符\nb或者break是停止交互式变基的变基命令。
  • rebase --interactive运行变基命令

这会立即停止交互式变基。现在您可以编辑.git/rebase-merge/git-rebase-todo并运行git rebase --continue.


Jér*_*ler 5

我使用此脚本(此外,它还可以简化提交拆分):

#!/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
Run Code Online (Sandbox Code Playgroud)

为您的.gitconfig添加别名:

[alias]
  autorebase = ! path_to_your_script
Run Code Online (Sandbox Code Playgroud)


Arc*_*ano 5

您可以使用touch编辑器来触摸文件,使其显示为已修改。例如

GIT_SEQUENCE_EDITOR=touch git rebase -i [commit]
Run Code Online (Sandbox Code Playgroud)

为了给它起别名,baseline作为我想要重新定位的标签给出

git config alias.baseline '!GIT_SEQUENCE_EDITOR=touch git rebase -i baseline'
Run Code Online (Sandbox Code Playgroud)

该别名在 Windows 下有效,因为它执行的 shellbash不是cmd.

  • 这与“git --interactive --exec &lt;cmd&gt; &lt;branch&gt;”配合得很好。我将“&lt;cmd&gt;”设置为运行我的分支引入或修改的测试的命令,并将“&lt;branch&gt;”设置为“master”。这会导致 git 针对分支中的每个提交运行我的测试。 (2认同)