Git Hooks
文章目录
Git Hooks
是 Git 提供的允许用户自定义的脚本,这些脚本会在特定条件下被触发,我们可以通过自定义脚本来定制 Git。
之前迁移博客到阿里云,Git Hooks
就是非常重要的一部分,我在服务器上使用的 Hook 类型是 post-receive
,今天把相关部分官方的文档重新看了下,这篇笔记是在官方文档的基础上进行演绎的。
安装 Hooks
多数情况下,所有的 hook 放在 .git/hooks
目录下,当我们执行 git init
时,Git 就会将一些示例脚本填充在 .git/hooks
目录下,这些示例脚本命名以 .sample
后缀,默认不执行,如果想执行这些脚本,可以重命名(去掉 .sample
后缀),也可以自定义脚本,保存在 .git/hooks
目录下,并且给予脚本执行权限。
需要注意的是,Hook 不随项目的克隆而进行复制,也不受版本控制的影响。
Hook 根据使用场景可以分为 客户端(本地) Hooks 和服务端 Hooks。不同使用场景下,根据不同触发条件又分为若干类。
客户端(本地) Hook
pre-commit
在 git commit
命令之后,这个脚本会首先运行,用来检查提交的快照,检查有没有遗漏,或者检查一些自定义的选项(例如检查代码格式,检查空格等),当脚本返回非 0 值时,则中断 commit
。
你也可以通过 git commit --no-verify
命令提交来跳过这个过程。
参数: 无
prepare-commit-msg
在 commit
过程中需要编辑 commit message
,这个脚本会在默认 commit message
生成之后,在你看到编辑器之前运行,通过这个脚本可以修改默认的 commit message
。
参数:
- 默认
commit message
文件路劲 - 提交类型
- commit SHA-1(可选)
commit-msg
这个脚本可以用来检验用户编辑的 commit message
。可以用来检查 commit message
是否合乎规范。
参数:
- 存放用户编写的
commit message
的临时文件的路劲
pre-rebase
这个脚本会在 git rebase
命令之前运行,在返回非 0 值时,会中断操作。
你可以通过这个脚本来禁用 rebase
,示例如下
1 | !/bin/sh |
服务端 Hook
服务端的 Hook 允许我们在 git push
的不同阶段进行操作。
pre-receive
客户端 push 过来的内容,必须通过这个脚本的检查来判断接受与否。
update
这个脚本在代码更新之前执行。update
和 pre-receive
很相似,不同的是,如果我们想把代码推到不同分支,那么 pre-receive
只会执行一次,而 update
在每个分支更新之前都会执行一次。
post-receive
post-receive
脚本在所有流程完成之后被触发,前几天迁移博客时才用到,服务器代码库合并了我的 push
后,通过 post-receive
脚本将仓库 clone
到我的博客目录下,以达到更新效果。
参考: