如何批量自动更改git历史中的部分提交消息
How to change part of commit messages in git history automatically in batch
我们在所有 git 提交前加上票号。有时我需要为一系列提交批量重命名票号。例如,我想在 origin/master
和 master
之间的所有提交中将提交消息中出现的所有 JIRA-1111
重命名为 JIRA-2222
。所以这个 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
或交互式变基更改单个提交的提交消息并手动编辑每个提交消息。但我的问题是:
如何在不手动编辑每个提交消息的情况下批量修改一系列提交的提交消息?
(如果您想知道我为什么需要这个:IntelliJ IDEA 中的提交对话框显示了最后的提交消息,其中包含我正在处理的票号。但有时(如果不是所有文件都已提交), 它不记得最后一条消息并显示一条较旧的消息。当这条较旧的消息包含不同的票号时,我们通常最终会在错误的票号下提交。)
运行 git rebase -i
打开一个编辑器,可以在其中更改提交消息。 Git documentation 指出:
By default, Git uses whatever you’ve set as your default text editor ($VISUAL or $EDITOR) or else falls back to the vi editor to create and edit your commit and tag messages. To change that default to something else, you can use the core.editor setting
将编辑器替换为例如更改提交消息的 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 为所需的提交范围变基:
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 ''"
我们在所有 git 提交前加上票号。有时我需要为一系列提交批量重命名票号。例如,我想在 origin/master
和 master
之间的所有提交中将提交消息中出现的所有 JIRA-1111
重命名为 JIRA-2222
。所以这个 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
或交互式变基更改单个提交的提交消息并手动编辑每个提交消息。但我的问题是:
如何在不手动编辑每个提交消息的情况下批量修改一系列提交的提交消息?
(如果您想知道我为什么需要这个:IntelliJ IDEA 中的提交对话框显示了最后的提交消息,其中包含我正在处理的票号。但有时(如果不是所有文件都已提交), 它不记得最后一条消息并显示一条较旧的消息。当这条较旧的消息包含不同的票号时,我们通常最终会在错误的票号下提交。)
运行 git rebase -i
打开一个编辑器,可以在其中更改提交消息。 Git documentation 指出:
By default, Git uses whatever you’ve set as your default text editor ($VISUAL or $EDITOR) or else falls back to the vi editor to create and edit your commit and tag messages. To change that default to something else, you can use the core.editor setting
将编辑器替换为例如更改提交消息的 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 为所需的提交范围变基:
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 ''"