Git hooks

本文最后更新于:8 个月前

Git hooks是在 Git 仓库中特定事件(certain points)触发后被调用的脚本。通过钩子可以自定义 Git内部的相关(如 git push)行为,在开发周期中的关键点触发自定义的行为

Git hooks

一、简介

Git hooks是在 Git 仓库中特定事件(certain points)触发后被调用的脚本。通过钩子可以自定义 Git内部的相关(如 git push)行为,在开发周期中的关键点触发自定义的行为。

Git 含有两种类型的钩子:

  • 客户端的,由诸如提交合并这样的操作所调用
  • 服务器端的,用于诸如接收被推送的提交这样的联网操作

Git hooks保存在.git/hooks/(对应裸仓库)或者.hooks/(对应普通仓库)目录下。

image-20221124234240236

初始化git仓库时,默认会创建很多.sample结尾的文件,这些都是示例文件,都是不生效的。如果要让这些示例文件生效,需要去掉.sample后缀

二、钩子清单

Git支持的钩子清单,参考Git - githooks Documentation (git-scm.com)

1、常用hooks

这里列举一些常见常用的hooks,(hooks名就对应钩子文件名)

hooks 调用时机 备注
pre-commit git commit 执行前 可通过git commit --no-verify跳过
commit-msg git commit 执行前 可通过git commit --no-verify跳过
post-commit git commit 执行后 这个钩子主要用于通知,不会影响commit的结果
pre-push push 执行前
pre-receive git-receive-pack 执行前
post-receive git-receive-pack 执行后 不影响 git-receive-pack 的结果
post-update 当 git-receive-pack 对 git push 做出反应并更新仓库中的引用时

2、post-receive

这个钩子在做「自动部署」的时候用到过,着重进行了解

Git官方的描述如下:

1
2
3
4
5
6
7
8
9
10
11
当git-receive-pack响应git推送并更新其存储库中的引用时,它会调用这个钩子。在更新所有ref之后,它在远程存储库上执行一次。

这个钩子为接收操作执行一次。它不接受任何参数,但获得的信息与预接收钩子对其标准输入的信息相同。

这个钩子不会影响gitreceivepack的结果,因为它是在真正的工作完成后调用的。

这取代了更新后的钩子,因为它获取所有引用的旧值和新值以及它们的名称。

标准输出和标准错误输出都被转发到另一端的git发送包,因此您可以简单地为用户回显消息。

默认的post-receivehook为空,但Git发行版的contrib/hooks目录中提供了一个示例脚本post-receive电子邮件,它实现了发送提交电子邮件。

【说明】[git-receive-pack](Git - git-receive-pack Documentation (git-scm.com)),作用:接收推送到存储库中的内容

三、团队同步hooks

git hooks保存在.git/目录下,这个目录是不会被同步到远程仓库的,因此多人协作时,需要考虑如何同步hooks的问题。如果直接copy难免显得不够优雅,且麻烦。

Husky工具可以帮助解决这个问题。它是一个npm包。

具体使用到时,再来深入了解。

四、hooks脚本

用于编写 git hooks 的脚本语言是没有限制的,可以用 nodejsshellpythonruby等脚本语言。

要注意的是,在执行这些脚本时,如果以非零的值退出程序,将会中断 git 的提交/推送流程。所以在 hooks 脚本中验证消息/代码不通过时,就可以用非零值进行退出,中断 git 流程。


Git hooks
http://timegogo.top/2022/11/24/Git/GitHooks/
作者
丘智聪
发布于
2022年11月24日
更新于
2023年7月16日
许可协议