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