Git 钩子
Git钩子(Hooks)是在Git执行某些操作时自动运行的脚本。它们可用于自动化任务、执行检查、强制规范等。
钩子位置
钩子文件位于 .git/hooks 目录中。每个钩子都有对应的示例文件(以 .sample 结尾):
ls .git/hooks
钩子类型
1. 客户端钩子
在本地机器上运行,分为以下几类:
提交钩子
| 钩子 | 说明 | 阻止提交 |
|---|---|---|
| pre-commit | 提交前运行 | 可以 |
| prepare-commit-msg | 提交信息编辑前运行 | 否 |
| commit-msg | 提交信息编辑后运行 | 可以 |
| post-commit | 提交后运行 | 否 |
其他客户端钩子
| 钩子 | 说明 |
|---|---|
| pre-rebase | 变基前运行 |
| post-checkout | checkout后运行 |
| post-merge | 合并后运行 |
| pre-push | 推送到远程前运行 |
2. 服务端钩子
在远程仓库上运行:
| 钩子 | 说明 | 阻止推送 |
|---|---|---|
| pre-receive | 接收推送前运行 | 可以 |
| update | 每次分支更新前运行 | 可以 |
| post-receive | 接收推送后运行 | 否 |
使用示例
pre-commit:代码检查
#!/bin/bash
# .git/hooks/pre-commit
echo "运行代码检查..."
# 运行 ESLint
npm run lint
if [ $? -ne 0 ]; then
echo "代码检查失败,提交被阻止"
exit 1
fi
echo "代码检查通过"
exit 0
commit-msg:规范提交信息
#!/bin/bash
# .git/hooks/commit-msg
COMMIT_MSG_FILE=$1
COMMIT_MSG=$(cat "$COMMIT_MSG_FILE")
# 提交信息格式检查
PATTERN="^(feat|fix|docs|style|refactor|test|chore)(\(.+\))?: .{1,50}"
if ! [[ $COMMIT_MSG =~ $PATTERN ]]; then
echo "提交信息格式不正确"
echo "格式: type(scope): description"
echo "type可选: feat, fix, docs, style, refactor, test, chore"
exit 1
fi
exit 0
pre-push:运行测试
#!/bin/bash
# .git/hooks/pre-push
echo "运行测试..."
npm test
if [ $? -ne 0 ]; then
echo "测试失败,推送被阻止"
exit 1
fi
exit 0
启用钩子
# 给钩子脚本添加执行权限
chmod +x .git/hooks/pre-commit
# 如果你想把钩子一起版本化,可以放在项目根目录
# 使用 Husky 或 similar 工具
使用 Husky 管理钩子(推荐)
Husky 是Git钩子的管理工具,支持在项目中版本化钩子配置。
安装
npm install husky --save-dev
npx husky install
配置
// package.json
{
"husky": {
"hooks": {
"pre-commit": "npm run lint",
"commit-msg": "commitlint --edit $1"
}
}
}
添加钩子
npx husky add .husky/pre-commit "npm run lint"
常用场景
- 代码质量检查:ESLint、Prettier
- 单元测试:提交前运行测试
- 提交信息规范:Conventional Commits
- 敏感信息检查:防止提交密钥/密码
- 自动修复:自动格式化代码
最佳实践
- 保持钩子脚本快速执行
- 提供清晰的错误信息
- 钩子脚本纳入版本控制(Husky)
- 允许跳过钩子(使用
--no-verify)