钩子都被存储在 Git 目录下的 hooks
子目录中。所有的示例都是 shell 脚本,其中一些还混杂了 Perl 代码,不过,任何正确命名的可执行脚本都可以正常使用 —— 你可以用 Ruby 或 Python,或任何你熟悉的语言编写它们。 这些示例的名字都是以 .sample
结尾,如果你想启用它们,得先移除这个后缀。
提交工作流钩子
pre-commit
: 在提交信息前运行。用于检查即将提交的快照。如果该钩子以 非零值 退出,Git 将放弃此次提交(可以用git commit --no-verify
来绕过)。prepare-commit-msg
: 启动提交信息编辑器之前,默认信息被创建之后运行。该钩子接受:存有当前提交信息的文件的路径、提交类型和修补提交的提交的 SHA-1 校验。commit-msg
: 接受存有当前提交信息的临时文件的路径,如果该钩子以 非零值 退出,Git 将放弃此次提交。post-commit
:整个提交过程完成后运行。电子邮件工作流钩子
applyaptch-msg
: 在git am
运行之前调用。接受包含请求合并信息的临时文件的名字。如果该钩子以 非零值 退出,Git 将放弃该补丁。pre-applypatch
: 该钩子运行于应用补丁 之后,产生提交之前。如果该钩子以 非零值 退出,该补丁不会提交。post-applypatch
: 运行于提交产生之后。其他钩子
pre-rebase
: 运行于变基之前。如果该钩子以 非零值 退出,Git 将放弃此次变基。post-rewrite
: 被那些会替换提交记录的命令调用,比如git commit --amend
和git rebase
。接受触发重写的命令名,同时从标准输入中接受一系列重写的提交记录。post-checkout
: 在git checkout
成功后运行post-merge
: 在git merge
成功后运行pre-push
: 在git push
运行期间, 更新了远程引用但尚未传送对象时被调用。接受远程分支的名字和位置作为参数,同时从标准输入中读取一系列待更新的引用。一个非零的退出码将终止推送过程。pre-auto-gc
: 在垃圾回收(git gc --auto
)开始之前被调用服务器钩子
pre-receive
: 来自客户端的推送操作时被调用。它从标准输入获取一系列被推送的引用。如果它以 非零值 退出,所有的推送内容都不会被接受。update
: 和pre-receive
脚本十分类似,不同之处在于它会为每一个准备更新的分支各运行一次。它不会从标准输入读取内容,而是接受三个参数:被推送的引用的名字(分支),推送前的引用指向的内容的 SHA-1 值,以及用户准备推送的内容的 SHA-1 值。 如果 update 脚本以非零值退出,只有相应的那一个引用会被拒绝;其余的依然会被更新。post-receive
: 在客户端的推送完成后被调用,它接受与pre-receive
相同的标准输入数据。