Git:是否可以使用pre-push钩子编辑提交消息?

4
在用户推送提交之前,我想在提交信息中添加分支名称。这是否可行?如果可以,我应该使用git commit --amend命令吗?
我们的分支名称包含票号,当它合并到主分支和Jenkins时很重要。为了方便查看,必须将其作为提交信息的第一行。为确保第一行是包含票号的分支名称,我想使用pre-push hook。我可以使用其他hook,例如prepare-commit-message或使用消息模板,但那会将分支名称放在每个提交上,并且不能确保在rebase后仍然存在分支名称。使用pre-push可以确保在进入远程之前已经有了分支名称。
更新:是的,这是可能的,但这是一个坏主意。pre-push hook在运行之前将refs与远程同步,但在任何对象被推送之前。这意味着远程已经设置了您正在推送的更改的提交sha。当pre-push hook修改提交消息时,新的sha将生成,使您立即与远程不同步。

我确定这是可能的,但你为什么想要这样做呢?分支是临时性的;工作范围——也就是工单号码——会是你希望捕获的内容。 - undefined
没问题。我想要确保提交信息中包含票号。由于我们的分支是在Jira内部生成的,它们会包含票号。 - undefined
1
是可能的。但是一个提交可以“属于”无限数量的现有或将来创建或删除的分支。如果在提交消息中写入分支名称,那么会产生误导。prepare-commit-msg钩子可能是更好的地方来完成这项工作。 - undefined
我特别想使用pre-push钩子。还有其他的钩子可以帮助格式化消息,但是pre-push最适合我的需求。我的目标是在必要之前不干扰用户的提交消息,也就是在他们推送到远程仓库之前。 - undefined
1个回答

4

你已经发现,答案实际上是“不行”。事实上,从更深层次的技术原因来看,它真正的意思是“不行”:无法编辑任何提交。 git commit --amend 实际上并没有“编辑提交”,而是将提交推到一边,并将当前分支名称(无论是什么)更改为指向新提交。这是“之前”的情况:

...--o--o--*   <--current_branch (HEAD)

而“after”则是:

          *   [abandoned - in reflog as HEAD@{1}, etc]
         /
...--o--o--X   <--current_branch (HEAD)

但是 pre-push 钩子在你的 Git 已经调用了另一个 Git 并提供了通过其哈希 ID 发送提交记录 *。你替换提交记录 * 为新的和改进的提交记录 X 的事实现在是无关紧要的:你的 Git 致力于推送提交记录 * ​​并要求他们的 Git 将它们的分支指向(它们的副本)提交记录 *。

在这个 pre-push 钩子中,你可以 拒绝 从你自己这端推送。现在推送被拒绝并失败了,你可以重新运行你的 git push 命令。这一次,你将向他们提议发送提交记录 X。如果看起来没问题,你就不需要运行 git commit --amend,并可以保留提交记录 X 进行推送。

请注意,最好在 Git 之外进行此操作。而不是:

$ git push remotename HEAD:somebranch

无论你实际运行的是什么,你只需要运行:

$ jirapush

这是您自己的脚本。在此脚本中,您可以按任何顺序运行所需的Git命令,运行git push remotename <hash>:<branchname>或者其他最终运行的命令之前。这些Git命令可能包括:

generate_new_commit_message_text | git commit --amend -F -

如果需要,在git push启动之前,所有操作都已完成。因此,您可以在此时进行任何所需的操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接