如何在批处理

时间:2016-03-13 14:05:08

标签: git git-rebase

我们在所有git提交前加上票号。有时我需要批量重命名一系列提交的票号。例如,我想在JIRA-1111JIRA-2222之间的所有提交中将提交消息中的所有origin/master次更改重命名为master。所以这个git历史:

* JIRA-1111 commit message 5 (master)
* JIRA-1111 commit message 4
* JIRA-42   commit message 3
* JIRA-2222 commit message 2
* JIRA-1111 commit message 1 (origin/master)

将更改为:

* JIRA-2222 commit message 5 (master) # <- renamed from 1111 to 2222
* JIRA-2222 commit message 4          # <- renamed from 1111 to 2222
* JIRA-42   commit message 3
* JIRA-2222 commit message 2
* JIRA-1111 commit message 1 (origin/master)

我知道如何使用--amend或交互式rebase更改单个提交的提交消息,并手动编辑每个提交消息。但我的问题是:

如何批量修改一系列提交的提交消息,而无需手动编辑每个提交消息?

(如果你想知道为什么我需要这个:IntelliJ IDEA中的提交对话框显示最后一个提交消息,其中包含我正在处理的票号。但有时(如果不是所有文件都已提交),它不会不记得最后一条消息并显示较旧的消息。当这条较旧的消息包含不同的票号时,我们通常最终会在错误的票号下提交。)

1 个答案:

答案 0 :(得分:3)

运行git rebase -i会打开一个编辑器,可以更改提交消息。 Git documentation声明:

  

默认情况下,Git使用您设置为默认文本编辑器($ VISUAL或$ EDITOR)的任何内容,或者回退到vi编辑器以创建和编辑您的提交和标记消息。要将默认值更改为其他内容,可以使用core.editor设置

用例如更改提交消息的sed命令替换编辑器将起到作用:

FROM=JIRA-1111
TO=JIRA-2222
export EDITOR="sed -e 's/^${FROM}/${TO}/' -e 's/^pick /reword /' -i ''"

第一个-e选项会相应地更改提交消息,第二个-epick关键字更改为reword-i强制sed在没有备份副本的情况下编辑文件。

导出EDITOR变量后,运行git rebase以获取所需的提交范围:

git rebase -i origin/master master

编辑:根据@torek的建议,export EDITOR=...部分可以更改为

export GIT_SEQUENCE_EDITOR="sed -e 's/^pick /reword /' -i ''"
export EDITOR="sed -e 's/^${FROM}/${TO}/' -i ''"