钩子都被存储在 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 --amendgit 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 相同的标准输入数据。