将字符串附加到一系列 git 提交的消息前面



我的本地 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 rebasereword每个 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

最新更新