Git在交互式rebase中添加所有提交消息的前缀

11

我进行了一个交互式的变基,直到提交abcdef

git rebase -i abcdef

在编辑器 Vim 中,我使用以下命令将所有代码行 pick hash 更改为

reword hash PREFIX:原提交信息

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

但接下来 git 会提示我为每个提交编辑消息。是否有简单的方法批处理此过程?

2个回答

9
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/"'


@jtill 你认为 https://davidwalsh.name/update-git-commit-messages 怎么样? - Peter Chaula
filter-branch也可以使用,只是现在最方便的是什么。有时需要螺丝刀,有时需要撬棍,有时一角硬币就足够了,有时所有这些工具最终都能完成工作,只是现在手头最方便的是什么。对于已检出的提交,使用git commit --amend;对于块重排、合并省略和轻度重写,使用git rebase -i;对于批量处理而不是块重排且重定位开销开始变得重要的情况,使用git filter-branch - jthill
第二个例子有一个小错别字 - 在 sed 命令中缺少斜杠。它应该是 sed -i "1s/^/PREFIX: /",如上所述。 - jthodges

4

使用只有git的替代答案:

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

您也可以非交互式地执行此操作(不使用-i标志)。 然后在交互窗口中,您可以在每个应应用前缀的提交之后删除执行指令。

说明:

  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. 要对重新设置基础(此处基于您的origin/master分支)中的每个提交执行此操作,您可以在每个提交上执行(4),使用单引号,否则每个提交都将获取上一个提交的消息,然后您就可以得到上面的命令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接