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/
(对应普通仓库)目录下。
初始化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 |
|
【说明】[git-receive-pack](Git - git-receive-pack Documentation (git-scm.com)),作用:接收推送到存储库中的内容
三、团队同步hooks
git hooks保存在.git/
目录下,这个目录是不会被同步到远程仓库的,因此多人协作时,需要考虑如何同步hooks的问题。如果直接copy难免显得不够优雅,且麻烦。
Husky工具可以帮助解决这个问题。它是一个npm包。
具体使用到时,再来深入了解。
四、hooks脚本
用于编写 git hooks 的脚本语言是没有限制的,可以用 nodejs
、shell
、python
、ruby
等脚本语言。
要注意的是,在执行这些脚本时,如果以非零的值退出程序,将会中断 git 的提交/推送流程。所以在 hooks 脚本中验证消息/代码不通过时,就可以用非零值进行退出,中断 git 流程。