Appearance
钩子概述
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/ 不在版本控制中,团队成员需要各自配置钩子。
解决方案:
- 在项目中创建
hooks/目录(纳入版本控制),然后软链接到.git/hooks/ - 使用钩子管理工具(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 自动化工作流的核心机制,合理利用钩子可以:
- 在提交前自动执行代码检查
- 强制执行提交信息规范
- 推送前运行测试
- 触发自动部署
下面几节将介绍具体的钩子类型和使用方式。