我的本地 git 存储库中有一系列提交,其中包含以下消息:
Added source.h
Broken link fixed
Corrected unit test
Deleted deprecated algorithm
...
在将它们推送到服务器之前,我想在每条提交消息前面附加票证信息:
Ticket #9999 (1): Added source.h
Ticket #9999 (2): Broken link fixed
Ticket #9999 (3): Corrected unit test
Ticket #9999 (4): Deleted deprecated algorithm
...
当然,我可以git rebase
并reword
每个 sigle 提交,但我想自动化该过程,因为它非常重复。
我认为这应该以某种方式可以通过git filter-branch
,但环境变量仅提供GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, GIT_AUTHOR_DATE, GIT_COMMITTER_NAME, GIT_COMMITTER_EMAIL, and GIT_COMMITTER_DATE
,但不是消息。
如何访问并自动操作提交消息?
编辑:请注意,票号始终相同,但括号中的数字依次递增。
假设您有将哪个票号附加到每条消息的逻辑,您将使用--msg-filter
选项filter-branch
。 有关详细信息,请参阅 https://git-scm.com/docs/git-filter-branch 中的文档。
按照 Mark 的提示使用filter-branch
的--msg-filter
选项,完整的解决方案是:
如果提交范围是XXX..HEAD
,括号内的数字可以用git rev-list --count XXX..$GIT_COMIIT
表示。 因此,消息可以用sed
进行转换:
git filter-branch --msg-filter '
i=`git rev-list --count XXX..$GIT_COMIIT`
sed "1s/^/Ticket #9999 ($i): /"
' XXX..HEAD
这个确切的功能有一个 githook。
此代码会将分支名称附加到提交消息之前:
#!/bin/sh
BRANCH_NAME=$(git branch 2>/dev/null | grep -e ^* | tr -d ' *')
if [ -n "$BRANCH_NAME" ]; then
echo "[$BRANCH_NAME] $(cat $1)" > $1
fi
如果你想让它工作,你首先需要在存储库的 .git/hooks 目录中创建一个可执行文件,并将其称为commit-msg
。
有关上面的来源,请参阅此链接:https://gist.github.com/bartoszmajsak/1396344/97081e76ab275f5fe526347908503febd1340495
还有另一个关于 git 钩子的有用链接:https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks