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

时间:2017-11-02 00:38:19

标签: git

在用户提交提交之前,我想将分支名称预先挂起到提交消息。这可能吗?

如果是,我会使用git commit --amend命令吗?

我们的分支机构名称包含机票编号,当它合并到主机和Jenkins中时,它很重要。要轻松查看,它必须是提交消息中的第一行。为了确保第一行是分支名称(包含票号),我想使用预推钩。我可以使用其他钩子,例如prepare-commit-message或使用消息模板,但是在每次提交时都会放置分支名称,并且它不能确保在rebase之后分支名称存在。使用pre-push可确保分支名称在进入远程之前就已存在。

=============

更新:是的,这是可能的,但这是一个坏主意。

pre-push hook会在运行之前但在推送任何对象之前将refs与远程同步。这意味着远程已经为您正在推送的更改设置了提交sha。当pre-push挂钩修改提交消息时,会生成一个新的sha,使您立即与远程同步。

1 个答案:

答案 0 :(得分:2)

正如您所发现的,答案实际上是“不”。事实上,由于更深层次的技术原因,它真正“不”:编辑任何提交是不可能的。 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将他们的分支设置为指向(他们的副本)commit *

在这个预推钩中你可以做的是拒绝来自你自己的推动。现在推送被拒绝并失败,您可以重新运行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之前发生了,所以你可以随时做任何想做的事情。