我需要在不更改任何其他提交信息的情况下,根据给定的提交ID修改提交的消息。但是,提交消息应该接受换行符,等等,类似于使用git commit
命令的方式。
例如,考虑以下提交
commit <id>
Author: <user-name> <user-email.com>
Date: ...
Hello World
我想将提交消息改写为此
Hello World
Text after line break1
More text
通常的方法是交互式地进行变基,然后使用git commit --amend
编辑提交。但是,这将修改提交信息,例如提交者的电子邮件,时间等。
git中的Filter-branch将仅通过更改提交消息和ID即可重写提交,如本answer中所示。
但是,如何使用filter-branch以上述提交消息格式重写提交?
请参见this link。
您可以使用git rebase -i HEAD~N
进行交互式变基,它将显示“ N”个提交。然后,您可以转到要更改的提交行,并将pick
重命名为reword
。
此后,您在即将出现的编辑器中调整提交消息。
[NOTE]
不建议更改/重新整理推送的提交,因为您必须force push
,其他人必须合并/重新克隆存储库。
注意: 以下方法确实解决了我的问题,但是我仍在寻找一种更简单的方法。
如回答here,以下脚本可用于使用过滤器分支对提交进行重新措辞:
#! /bin/bash
REV=$1
MESSAGE=$2
FILTER="test $(echo '$GIT_COMMIT') = $(git rev-parse $REV) && echo $MESSAGE || cat"
git filter-branch --msg-filter "$FILTER" -- --all
usage: ./script_name.sh <commit-id> "commit message"
但是在新的提交消息中添加换行符,我不得不将提交消息修改为:"$(echo -e 'summary_line\n\nmessage\nmore_message')"
如回答here。根据summary_line
的常规约定,上述命令在commits之后添加了两个换行符。
此外,由于注释here中提到的转义序列字符,不得不修改脚本。
此行$MESSAGE
中的[$(git rev-parse $REV) && echo $MESSAGE
更改为\"$MESSAGE\"
] >>
因此,如果脚本名称为reword-commit.sh
,则为最终命令,(将在git存储库中运行)
./reword-commit.sh <commit-id> "$(echo -e 'Hello World\n\nText after line break1\nMore Text')"