git中pre-push和pre-receive钩子之间的区别是什么?

9

在Git中,pre-push和pre-receive hook有什么不同,从使用情况或工作逻辑方面来说?根据它们的文档,我能理解的唯一区别在于它们接收的输入格式 -

1. Pre-Push:关于要推送的信息将在钩子的标准输入中提供,格式为local ref SP local sha1 SP remote ref SP remote sha1 LF

2. Pre-receive:对于每个要更新的引用,它会在标准输入上接收一个格式为old-value SP new-value SP ref-name LF的行。
然而,我想知道是否有特定的用例适用于每个hook,或者它们可以互换使用?

1个回答

10

其中一个(pre-push)是客户端钩子(hook),另一个(pre-receive)是服务器端钩子(hook)

在这个方面,它们是非常不同的,如果您想要始终执行特定策略,则通常在 pre-receive (服务器侧) 钩子中执行。这样,您就不必担心在每个客户端上部署pre-push钩子。

记住:钩子是{{局部于存储库}}的,这意味着 pre-push 钩子不能轻松地分发给任何下游存储库(downstream repo)。但是,如果这些下游存储库都引用同一个上游存储库,那么 pre-receive 钩子可以应用于它们所有的存储库。


好的。那么pre-push是客户端钩子,而pre-receive是服务器端钩子,我认为是这样的? - phoenix
@user1783805 我已经添加了下游仓库的概念:这非常重要。 - VonC
非常感谢。回答清晰简洁!! - phoenix
@user1783805 我也回答了你在类似主题“为整个团队创建全局 pre-commit 钩子”上的问题。 - VonC
我应该使用 pre-push 还是 pre-receive 来进行一些代码检查测试(如 flake8),而不想使用 pre-commit 钩子?我希望整个团队都能执行这些测试,但有点困惑。谢谢。 - Abhijeet Khangarot
1
我希望整个团队都能执行测试,如果代码检查失败,则使用 pre-receive(服务器端)钩子拒绝推送。 - VonC

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