hook,直译过来是“钩子”,通常是用于在某事件发生或者完成后添加自定义的动态事件/任务。在使用 git 时,我们也可以通过 git hook 来完成一些自动测试、集成、构建等流程工作。如果 git hook 执行失败将终止后续操作。
在项目的 .git/hooks
目录中会有很多 hook-name.sample
的文件,提供了常见 hook 的 shell 脚本模板,当然我们也可以使用 Python、Ruby 等其它脚本语言编写 hook,不过不要忘记在脚本首行加上 shebang 声明,并赋予可执行权限。
根据 hook 执行的位置,可以分为“客户端 hook”和“服务器端 hook”,客户端 hook 在开发者本地环境运行,服务器端 hook 则运行在项目的托管服务器上,通常是在接收提交时触发。
git commit
相关 hookpre-commit
:提交前执行,可以使用 git commit --no-verify
命令跳过该 hook。prepare-commit-msg
:在启动提交信息编辑器之前执行,用于定制提交时出现信息。可以结合提交模板使用,动态地插入信息。commit-msg
:post-commit
:提交过程完成后运行的 hook,不接收任何参数。git am
相关 hookgit am
用于应用(apply)来自邮箱(mailbox)的 patch,am
正是 “apply mailbox” 的缩写。am
流程会检测 3 个 hook:
pre-applypatch
:运行于应用补丁后、产生 commit 前。因此更合理的命名可能应该是 post-applypatch-pre-commit
。applypatch-msg
:它接收单个参数:包含请求合并信息的临时文件的名字。如果脚本返回非零值,Git 将放弃该补丁。你可以用该脚本来确保提交信息符合格式,或直接用脚本修正格式错误。post-applypatch
:应用补丁并产生提交之后。pre-rebase
:运行于 git rebase
之前,官方的例子中是用于禁止对已推送的 commit 进行 rebase 操作,这样可以防止于线上的代码库发生冲突。post-checkout
:checkout
命令执行完成之后会调用的 hook,通常用于自动调整运行环境。post-merge
:运行于合并操作完成之后。pre-auto-gc
:在运行 git gc --auto
命令前执行,可以用于提醒即将进行垃圾回收,或者现在是否应当进行垃圾回收。post-rewrite
:运行于重写提交信息的命令之前,比如 git commit --amend
之前。pre-push
:在 push 操作前执行。pre-receive
:接收到来自客户端的推送时最先调用的 hook,可以用户阻止“non-fast-forward” 的更新,或者进行文件访问控制。update
:类似 pre-receive
,不过在同时推送多个分支时 pre-receive
仅仅运行一次,update
会每个分支执行一次。post-update
:运行于整个接收服务完成之后。参考: