我们在所有git提交前加上票号。有时我需要批量重命名一系列提交的票号。例如,我想在JIRA-1111
和JIRA-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中的提交对话框显示最后一个提交消息,其中包含我正在处理的票号。但有时(如果不是所有文件都已提交),它不会不记得最后一条消息并显示较旧的消息。当这条较旧的消息包含不同的票号时,我们通常最终会在错误的票号下提交。)
答案 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
选项会相应地更改提交消息,第二个-e
将pick
关键字更改为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 ''"