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
2
3
4
#!/bin/sh
# disallow rebasing any commits
echo "pre-rebase: Rebasing is disallowed."
exit 1

服务端 Hook

服务端的 Hook 允许我们在 git push 的不同阶段进行操作。

pre-receive

客户端 push 过来的内容,必须通过这个脚本的检查来判断接受与否。

update

这个脚本在代码更新之前执行。
updatepre-receive 很相似,不同的是,如果我们想把代码推到不同分支,那么 pre-receive 只会执行一次,而 update 在每个分支更新之前都会执行一次。

post-receive

post-receive 脚本在所有流程完成之后被触发,前几天迁移博客时才用到,服务器代码库合并了我的 push 后,通过 post-receive 脚本将仓库 clone 到我的博客目录下,以达到更新效果。

参考: