将字符串添加到 git 提交范围的消息中

Prepend string to messages of a range of git commits

我的本地 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 每次提交,但我想自动化这个过程,因为它是如此重复。

我认为 git filter-branch 应该可以实现,但环境变量只提供 GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, GIT_AUTHOR_DATE, GIT_COMMITTER_NAME, GIT_COMMITTER_EMAIL, and GIT_COMMITTER_DATE,但不是消息。

如何访问和自动操作提交消息?

编辑: 注意票号总是一样的,只是括号里的数字是依次递增的。

假设您有逻辑将哪个票号附加到每条消息,您将使用 filter-branch--msg-filter 选项。有关详细信息,请参阅 https://git-scm.com/docs/git-filter-branch 上的文档。

这个确切的功能有一个 git 挂钩。

此代码会将分支名称添加到提交消息中:

#!/bin/sh

BRANCH_NAME=$(git branch 2>/dev/null | grep -e ^* | tr -d ' *')
if [ -n "$BRANCH_NAME" ]; then
    echo "[$BRANCH_NAME] $(cat )" > 
fi

如果你想让它工作,你首先需要在你的 repo 的 .git/hooks 目录中创建一个可执行文件,并将其命名为 commit-msg.

查看上面的来源 link:https://gist.github.com/bartoszmajsak/1396344/97081e76ab275f5fe526347908503febd1340495

还有另一个有用的 link 关于 git 钩子:https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks

to use the --msg-filter option of filter-branch之后,完整的解决方案是:

如果提交范围是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