Git Hooks 配置指南
Git hooks 是在 Git 执行特定操作时自动运行的脚本,可以用于自动化开发流程、代码质量检查等。以下是常见的 Git hooks 配置方法和示例代码。
基本配置方法
- Git hooks 位于项目的
.git/hooks
目录中 - 默认有一些示例脚本(以
.sample
结尾) - 要启用一个 hook,只需移除
.sample
后缀并确保文件可执行
常用 Git hooks 示例
1. pre-commit - 提交前检查
bash
#!/bin/sh
# 检查是否有未添加的更改
if ! git diff --quiet --exit-code; then
echo "存在未暂存的更改,请先使用 git add 添加更改"
exit 1
fi
# 运行代码风格检查
npm run lint
if [ $? -ne 0 ]; then
echo "代码风格检查失败,请修复后重新提交"
exit 1
fi
# 运行单元测试
npm test
if [ $? -ne 0 ]; then
echo "单元测试失败,请修复后重新提交"
exit 1
fi
2. commit-msg - 检查提交消息格式
bash
#!/bin/sh
# 确保提交消息符合规范
MSG_FILE=$1
MSG=$(cat "$MSG_FILE")
# 示例:要求提交消息以特定前缀开头
if ! echo "$MSG" | grep -qE '^(feat|fix|docs|style|refactor|test|chore)\(.*\): .+'; then
echo "提交消息格式错误!"
echo "正确格式: <type>(<scope>): <subject>"
echo "示例: feat(auth): 添加登录功能"
exit 1
fi
3. pre-push - 推送前检查
bash
#!/bin/sh
# 确保所有测试通过
npm run test:ci
if [ $? -ne 0 ]; then
echo "测试失败,请修复后再推送"
exit 1
fi
# 确保代码已构建
npm run build
if [ $? -ne 0 ]; then
echo "构建失败,请修复后再推送"
exit 1
fi
4. post-merge - 合并后自动安装依赖
bash
#!/bin/sh
# 合并后检查 package.json 是否有变化
if git diff-tree -r --name-only --no-commit-id HEAD | grep -q 'package.json'; then
echo "检测到 package.json 变更,正在安装依赖..."
npm install
fi
高级配置方法
使用 Husky 管理 Git hooks(推荐)
Husky 是一个流行的工具,可以更轻松地管理 Git hooks。
- 安装 Husky:
bash
npm install husky --save-dev
- 在 package.json 中配置:
json
{
"scripts": {
"prepare": "husky install"
},
"husky": {
"hooks": {
"pre-commit": "npm run lint",
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS",
"pre-push": "npm test"
}
}
}
或者使用独立的配置文件 .husky/
目录:
bash
npx husky add .husky/pre-commit "npm test"
npx husky add .husky/commit-msg 'npx --no-install commitlint --edit "$1"'
使用 pre-commit 框架(Python 项目)
对于 Python 项目,可以使用 pre-commit 框架:
- 安装:
bash
pip install pre-commit
- 创建
.pre-commit-config.yaml
文件:
yaml
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v3.2.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-added-large-files
- repo: https://github.com/psf/black
rev: 22.3.0
hooks:
- id: black
- 安装 hooks:
bash
pre-commit install
注意事项
- 确保 hook 脚本有可执行权限:
chmod +x .git/hooks/pre-commit
- 如果 hook 失败(非零退出码),Git 操作将中止
- 可以在 hook 中使用
git stash
来保存未提交的更改 - 对于团队项目,建议将 hooks 放在项目根目录的
hooks/
文件夹中,然后使用git config core.hooksPath hooks
来指定 hooks 路径
希望这些示例能帮助你配置 Git hooks!根据你的项目需求选择合适的 hook 和检查逻辑。