如何批量自动更改git历史记录中的部分提交消息

如何批量自动更改git历史记录中的部分提交消息,git,git-rebase,Git,Git Rebase,我们在所有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 * JIR

我们在所有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)

*JIRA-2222提交消息5(主)#运行
git-rebase-i
打开一个编辑器,可以在其中更改提交消息。声明:

默认情况下,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
拾取
关键字更改为
重写
,并且
-i
强制
sed
在没有备份副本的情况下就地编辑文件

导出
编辑器
变量后,针对所需的提交范围运行git rebase:

git rebase -i origin/master master

编辑:根据@torek的建议,
导出编辑器=…
部分可以更改为

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

为什么一个问题有多个提交?为什么不压缩您的提交?因为这会使代码审查变得困难。在小步骤中比在单个大压缩提交中更容易理解更改。请注意,在上一次提交中编辑消息时,所有后续提交都会得到新哈希值(这当然会导致该提交具有新哈希值)。除此之外,您使用的IDE听起来是有害的,而不是有益的。IDE似乎总是这样做,这就是我避免使用它们的原因。:-)使用两个单独的编辑器脚本(当然都可以使用sed)会更安全一些,一个在
$GIT\u SEQUENCE\u editor
中编辑pick命令,另一个在
$GIT\u editor
$editor
$VISUAL
中编辑消息。指定的导出命令工作不正常。
-i'
开关导致Git错误消息
sed:can't read:没有这样的文件或目录
无法执行编辑器
。此外,如果只想更改提交消息的第一行(例如,添加提交消息前缀而不是只更改它),则需要将
sed
表达式扩展到
1s/../../
。工作导出命令是(省略可选的
-e
):
export GIT_SEQUENCE\u EDITOR=“sed's/^pick/reword/'-i”
export GIT_EDITOR=“sed'1 s/^${FROM}/${TO}/'-i”
@MichaelFiedler,
…sed 1…
对我不起作用(在win7上的GIT bash中)