Git 在交互式变基中预先添加所有提交消息

Git prepend all commit messages in interactive rebase

我 运行 一个交互式变基直到提交 abcdef

git rebase -i abcdef

在编辑器中 - Vim 我将所有 pick hash 行更改为

reword hash PREFIX: Original commit message 使用此 vim 命令

%s/pick \(\w\{7}\)/reword PREFIX:/

但随后 git 继续提示我为每次提交编辑消息。有没有简单的方法来批处理这个过程?

GIT_EDITOR='sed -i "1s/^/PREFIX: /"' GIT_SEQUENCE_EDITOR=vim \
        git rebase -i abcdef

或者您也可以

git -c core.editor='sed -i "1s/^/PREFIX: /"' \
        -c sequence.editor=vim \
        rebase -i abcdef

如果您不想使用环境覆盖。

如果你知道你要改写它们,你甚至可以 sed 序列,GIT_SEQUENCE_EDITOR='sed -i "s/^pick/reword/"'

仅使用 git 的备选答案:

git rebase -i --exec 'git commit --amend -m "PREFIX: $(git show -s --format=%s)"' origin/master

您也可以非交互式地执行此操作(没有 -i 标志)。之后在交互式 window 中,您可以在每次提交后删除 exec 指令,其中前缀 不应 被应用。

解释:

  1. 使用rebase --exec你可以为每次提交执行一个命令,这非常有用。

  2. 使用git commit --amend -m <MESSAGE>您可以更改当前提交的消息。

  3. 使用git show -s --format=%s你可以显示当前的提交信息。

综合起来:

  1. 要给消息加前缀我们必须得到当前消息(3),并用修改(2)改变当前消息,即git commit --amend -m "PREFIX: $(git show -s --format=%s)"双引号 很重要,以便命令在消息字符串中执行。

  2. 要对 rebase 中的每个提交执行此操作(基于此处的 origin/master 分支),您在每次提交时执行 (4),使用 单引号 否则每次提交都会得到你最后一次提交的消息,瞧,你会得到上面的命令。