Skip to content

钩子概述

Git 钩子(Hooks)是在 Git 操作的特定时间点自动触发的脚本。它们让你可以自动化各种工作流任务,如代码检查、提交信息验证、自动部署等。

客户端钩子 vs 服务端钩子

类型运行位置触发时机
客户端钩子开发者本地机器提交、合并、推送等操作
服务端钩子远程仓库服务器接收推送时

客户端钩子(本地操作):

  • pre-commit:提交前
  • prepare-commit-msg:准备提交信息
  • commit-msg:提交信息写入后
  • post-commit:提交完成后
  • pre-push:推送前
  • pre-rebase:变基前
  • post-merge:合并后
  • post-checkout:检出后

服务端钩子:

  • pre-receive:接收推送前
  • update:更新每个引用前
  • post-receive:接收推送后

钩子存放位置与激活方式

钩子存放在 .git/hooks/ 目录下:

bash
ls .git/hooks/
# applypatch-msg.sample
# commit-msg.sample
# fsmonitor-watchman.sample
# post-update.sample
# pre-applypatch.sample
# pre-commit.sample
# pre-merge-commit.sample
# pre-push.sample
# pre-rebase.sample
# pre-receive.sample
# prepare-commit-msg.sample
# update.sample

激活钩子的方法:

bash
# 方法1:复制示例文件,去掉 .sample 后缀
cp .git/hooks/pre-commit.sample .git/hooks/pre-commit

# 方法2:创建新脚本
cat > .git/hooks/pre-commit << 'EOF'
#!/bin/sh
echo "执行 pre-commit 钩子"
# 你的代码检查逻辑
EOF

# 赋予执行权限(必须!)
chmod +x .git/hooks/pre-commit

钩子的执行权限

必须赋予执行权限,否则钩子不会执行:

bash
chmod +x .git/hooks/pre-commit
chmod +x .git/hooks/commit-msg

钩子支持任何可执行脚本:

bash
#!/bin/sh          # Shell 脚本
#!/usr/bin/env python3  # Python 脚本
#!/usr/bin/env node      # Node.js 脚本
#!/usr/bin/env ruby      # Ruby 脚本

钩子的退出码:

  • 退出码 0:操作允许继续
  • 非零退出码:操作被中止(对于 pre-* 钩子)
bash
#!/bin/sh
# pre-commit 示例
npm run lint
if [ $? -ne 0 ]; then
  echo "代码检查失败,提交已中止"
  exit 1  # 非零退出码,阻止提交
fi
exit 0    # 允许提交

钩子的限制

不会自动共享.git/hooks/ 不在版本控制中,团队成员需要各自配置钩子。

解决方案:

  1. 在项目中创建 hooks/ 目录(纳入版本控制),然后软链接到 .git/hooks/
  2. 使用钩子管理工具(Husky、lefthook 等)自动管理
bash
# 方案1:手动软链接
mkdir scripts/hooks
cp .git/hooks/pre-commit.sample scripts/hooks/pre-commit
# 团队成员执行以下命令安装
git config core.hooksPath scripts/hooks

# 方案2:使用 Husky(Node.js 项目推荐)
npm install husky --save-dev
npx husky install

绕过钩子

某些情况下需要临时跳过钩子(谨慎使用):

bash
# 跳过 pre-commit 和 commit-msg 钩子
git commit --no-verify -m "紧急修复"
git commit -n -m "紧急修复"    # -n 是 --no-verify 的简写

# 跳过 pre-push 钩子
git push --no-verify

警告--no-verify 会绕过所有客户端钩子,应仅在紧急情况下使用。

总结

钩子是 Git 自动化工作流的核心机制,合理利用钩子可以:

  • 在提交前自动执行代码检查
  • 强制执行提交信息规范
  • 推送前运行测试
  • 触发自动部署

下面几节将介绍具体的钩子类型和使用方式。