Git 钩子(Hooks)是一种自动化机制,允许在 Git 操作(如提交、推送、合并等)前后执行自定义脚本。钩子可以用于代码质量检查、自动化部署、安全审计等场景,是团队协作和 DevOps 流程中的重要工具。

本章将介绍 Git 钩子的安装方法、常见的钩子类型,以及如何编写和使用钩子。


16.1 安装钩子

Git 钩子是 Git 仓库的一部分,存储在 .git/hooks/ 目录下。Git 默认会提供一些示例钩子文件(以 .sample 结尾),可以基于这些示例创建自定义钩子。

16.1.1 钩子示例

列出 .git/hooks/ 目录中的默认钩子:

  1. ls .git/hooks/

示例输出:

  1. applypatch-msg.sample commit-msg.sample pre-commit.sample
  2. post-commit.sample pre-push.sample pre-rebase.sample

这些 .sample 文件是模板,去掉 .sample 扩展名后,即可使其生效。例如,启用 pre-commit 钩子:

  1. mv .git/hooks/pre-commit.sample .git/hooks/pre-commit
  2. chmod +x .git/hooks/pre-commit

16.1.2 创建一个钩子

Git 钩子是普通的 Shell 脚本(也可以使用 Python、Perl 或其他语言)。例如,创建 pre-commit 钩子,在每次提交前检查代码格式:

  1. vim .git/hooks/pre-commit

添加以下内容:

  1. #!/bin/bash
  2. echo "运行 pre-commit 钩子"
  3. eslint src/ || exit 1

然后赋予可执行权限:

  1. chmod +x .git/hooks/pre-commit

现在,每次 git commit 时,Git 都会执行 pre-commit 钩子,若 ESLint 检测失败,则提交会被阻止。


16.2 可用的钩子

Git 提供了多种钩子,主要分为两类:

  1. 客户端钩子(作用于本地仓库)
  2. 服务器端钩子(作用于远程仓库)

16.2.1 与提交相关的钩子

钩子名称 触发时机 作用
pre-commit git commit 之前 检查代码质量,如 ESLint、Prettier
prepare-commit-msg 生成提交消息之前 修改提交信息,例如自动添加 JIRA 号
commit-msg git commit 之后 校验提交信息格式
post-commit 提交完成后 发送通知,如 Slack/Email

示例:commit-msg 强制要求提交信息包含 #issue

  1. vim .git/hooks/commit-msg
  1. #!/bin/bash
  2. commit_msg=$(cat "$1")
  3. if ! grep -qE "#[0-9]+" <<< "$commit_msg"; then
  4. echo "提交信息必须包含 Issue 编号(如 #123)"
  5. exit 1
  6. fi

16.2.2 与补丁相关的钩子

钩子名称 触发时机 作用
applypatch-msg git am 之前 检查补丁信息
pre-applypatch git am 之前 代码检查
post-applypatch git am 之后 发送通知

16.2.3 与推送相关的钩子

钩子名称 触发时机 作用
pre-push git push 之前 运行测试,如 Jest/Pytest
update 远程仓库收到推送 代码审查

示例:pre-push 禁止推送 debug.log

  1. vim .git/hooks/pre-push
  1. #!/bin/bash
  2. if git diff --cached --name-only | grep "debug.log"; then
  3. echo "禁止推送 debug.log 文件"
  4. exit 1
  5. fi

16.2.4 其他本地版本库的钩子

钩子名称 触发时机 作用
pre-rebase git rebase 之前 防止错误变基
post-checkout git checkout 自动安装依赖
post-merge git merge 重新安装依赖或清理文件

示例:post-merge 自动安装依赖

  1. vim .git/hooks/post-merge
  1. #!/bin/bash
  2. if [ -f package.json ]; then
  3. echo "运行 npm install..."
  4. npm install
  5. fi

结论

本章介绍了 Git 钩子的作用、如何安装和创建钩子,以及不同类型的 Git 钩子。钩子是 Git 自动化的重要工具,可用于代码质量检查、自动化部署、版本控制策略执行等。