【问题标题】:Why git-revert doesn't invoke the pre-commit and the commit-msg hooks?为什么 git-revert 不调用 pre-commit 和 commit-msg 钩子?
【发布时间】:2018-07-28 21:45:25
【问题描述】:

使用 strace 我注意到 git-revert 只调用了两个钩子:

  • 准备提交消息
  • 提交后

但是 git-commit 调用这四个:

  • 预提交
  • 准备提交消息
  • 提交消息
  • 提交后

既然 git-revert 产生一个提交,为什么它不调用相同的 作为 git-commit 的钩子?

我在 Git 邮件列表上问过这个问题,但没有得到回应。所以我在这里问。

当我实现一个钩子来检测时,我最终研究了这个 并拒绝恢复合并提交的提交,因为它们是 troublesome.

我尝试将它实现为一个 commit-msg 钩子来搜索字符串 提交消息中的“这将恢复提交 SHA-1”。但是 git-revert 不调用 commit-msg 钩子。

所以,现在我将我的检查实现为预接收挂钩。但我发现 将所有预接收检查也作为 pre-commit 或 commit-msg 钩子,以便我可以检测到问题 提交时间而不是仅在推送时间。

【问题讨论】:

  • 需要明确的是,revert commit 没有触发客户端钩子或服务器端钩子的问题?我认为你可以创建一个服务器端钩子,它可以检测到这样的提交,然后阻止它。但是对一个好问题 +1。
  • 问题是命令 git-revert 没有调用命令 git-commit 调用的所有客户端钩子

标签: git


【解决方案1】:

The sequencer code actually runs git commit to produce the commit。但是这段代码(见上面的链接)包含片段:

    if (!(flags & VERIFY_MSG))
            argv_array_push(&cmd.args, "-n");

这意味着它默认运行git commit -n-n 标志:

绕过 pre-commit 和 commit-msg 钩子

the git commit documentation. 中所述,设置VERIFY_MSG 的东西是交互式变基“编辑”或“改写”等,但不是git cherry-pick

请注意,一旦定序器完成,它将调用您的 post-rewrite 钩子(如果有的话),因此您应该将检查放在那里。 正如您所指出的,您可以专门编辑提交消息,如果你这样做了,看起来你的提交消息钩子应该被使用,但事实并非如此。

【讨论】:

  • 您的领导让我找到了 git-revert 使用 -n 标志调用 git-commit 的原因。它发生在 2005 年 Junio Hamano 提交的 9fa4db544e2e 上!我明白了,但是由于您可以在 git-revert 中编辑提交消息,因此我认为有必要进行预提交和默认调用的提交消息。不管怎样,我会把这个讨论带到 Git 的邮件列表中。但是,我检查了 git-revert 并没有调用 post-rewrite 钩子。即使这样做了,因为它是一个“post”钩子,它也无法中止命令。但是你回答了我的问题。谢谢!
  • 哎呀,对,重写后挂钩调用仅在定序器用于git rebase -i时。
猜你喜欢
  • 2017-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 2019-11-26
  • 2021-03-19
  • 2020-05-21
相关资源
最近更新 更多