在用户推送他们的提交之前,我想将分支名称预先添加到提交消息中。 这可能吗?
如果是,我会使用
git commit --amend
命令吗?
我们的分支名称包含票号,当其合并到 master 和 Jenkins 中时查看此信息很重要。 为了容易地看到它,它必须是提交消息中的第一行。 为了确保第一行是分支名称(包含票号),我想使用预推送挂钩。 我可以使用其他钩子,例如
prepare-commit-message
或使用消息模板,但这会将分支名称放在每次提交上,并且不能确保分支名称在变基后存在。 使用预推送可确保分支名称在进入远程之前就存在。
==============
预推送挂钩在运行之前但在推送任何对象之前将引用与远程同步。 这意味着远程已经为您推送的更改设置了提交 sha。 当 pre-push
钩子修改提交消息时,会生成一个新的 sha,使您立即与远程不同步。
git commit --amend
所做的不是“编辑提交”,而是将提交放在一边并更改当前分支名称(无论是什么)以指向新提交。 “之前”的图片是:
...--o--o--* <--current_branch (HEAD)
“之后”是:
* [abandoned - in reflog as HEAD@{1}, etc]
/
...--o--o--X <--current_branch (HEAD)
但是预推送挂钩在您的 Git 已经调用另一个 Git 并通过其哈希 ID 向其发送提交
*
后运行。 事实上,您已将
提交
*
替换为新的改进的提交
X
,这一事实现在已经无关紧要:您的 Git 致力于推送提交 *
并要求他们的 Git 将 他们的分支设置为指向(他们的副本)提交
*
。在这个预推钩子中,你可以做的是拒绝来自你自己端的推送。 现在推送被拒绝并失败,您可以重新运行
git push
命令。 这次您将建议向他们发送提交X
。 如果看起来正确,您将不需要运行 git commit --amend
,并且可以将提交
X
留在原地进行推送,然后让推送运行。请注意,在 Git 之外执行此操作要好得多。 而不是:
$ git push remotename HEAD:somebranch
或者无论你实际运行什么,你都会运行:
$ jirapush
这是你自己的脚本。 在此脚本中,您可以以任何顺序运行您喜欢的任何 Git 命令,before
运行
git push remotename <hash>:<branchname>
或您将在最后运行的任何命令。 这些 Git 命令可以包括,例如:
generate_new_commit_message_text | git commit --amend -F -
如果需要的话。 因为这一切都发生在
git push
启动之前,所以现在正是做你想做的事情的时候。