Git Hooks 自动化工作流配置
Git Hooks 自动化工作流配置
Git Hooks 是 Git 提供的一种脚本触发机制,允许你在特定的 Git 操作前后自动执行自定义脚本。常见的用途包括:代码风格检查、单元测试运行、提交信息规范检查、自动部署等。通过在 .git/hooks/ 目录下放置可执行脚本,Git 会在相应事件触发时自动运行它们。
Git 提供了多种钩子类型,按触发时机分为客户端钩子和服务端钩子。客户端钩子在本地操作时触发,如 pre-commit、commit-msg;服务端钩子在 git push 到远程时触发,如 pre-receive、post-receive。
常用客户端钩子
pre-commit:在 git commit 执行前触发,常用于代码风格检查、语法验证、Lint 检查。如果脚本返回非零值,提交将被拒绝。
# .git/hooks/pre-commit
#!/bin/bash
echo "运行 pre-commit 检查..."
检查 JavaScript 文件语法
for file in $(git diff --cached --name-only --diff-filter=ACM | grep ".js$"); do
node --check "$file" || exit 1
done
运行 ESLint
if [ -f "package.json" ]; then
npx eslint $(git diff --cached --name-only --diff-filter=ACM | grep ".js$") || exit 1
fi
echo "pre-commit 检查通过"
exit 0
commit-msg:在提交信息填写完毕后、提交创建前触发,常用于验证提交信息格式。
# .git/hooks/commit-msg
#!/bin/bash
commit_msg=$(cat "$1")
pattern="^(feat|fix|docs|style|refactor|test|chore)((.+))?: .{1,50}"
if ! [[ "$commit_msg" =~ $pattern ]]; then
echo "提交信息格式错误!"
echo "格式要求: type(scope): description"
echo "示例: feat(login): 添加第三方登录功能"
exit 1
fi
exit 0
post-commit:在提交完成后触发,常用于通知、构建触发等。
# .git/hooks/post-commit
#!/bin/bash
echo "提交完成: $(git log -1 --oneline)"
触发 CI 构建
curl -s "https://ci.example.com/build?commit=$(git rev-parse HEAD)" > /dev/null || true
常用服务端钩子
pre-receive:在远程仓库收到推送前执行,常用于强制推送规范检查、权限控制。
# .git/hooks/pre-receive
#!/bin/bash
while read oldrev newrev refname; do
branch=$(echo "$refname" | sed "s/refs/heads///")
# 禁止向 main 分支强制推送
if [ "$branch" = "main" ] && [ "$oldrev" != "0000000000000000000000000000000000000000" ]; then
echo "禁止向 main 分支强制推送"
exit 1
fi
done
exit 0
post-receive:在推送被接受后执行,常用于自动部署。
# .git/hooks/post-receive
#!/bin/bash
branch=$(echo "$refname" | sed "s/refs/heads///")
if [ "$branch" = "main" ]; then
echo "开始部署到生产环境..."
cd /var/www/app || exit
git pull origin main
npm install
pm2 restart app
echo "部署完成"
fi
使用 Husky 管理 Git Hooks
手动管理 .git/hooks 容易遗忘,且不便团队同步。使用 Husky 可以将钩子脚本纳入版本控制。
npm install husky --save-dev
初始化 husky(会在 .husky/ 目录创建钩子)
npx husky install
添加 pre-commit 钩子
npx husky add .husky/pre-commit "npm run lint"
npx husky add .husky/commit-msg "npx commitlint --edit $1"
提交 .husky 配置到版本控制
git add .husky
git commit -m "添加 Git Hooks 配置"
跳过钩子
临时跳过 pre-commit 钩子
git commit --no-verify -m "紧急提交,跳过检查"
跳过 commit-msg 钩子
git commit --no-verify -m "quick fix"
注意事项
- .git/hooks/ 目录下的示例脚本以 .sample 为后缀,Git 不会自动执行它们,需要去掉后缀并添加执行权限
- 钩子脚本要有执行权限(chmod +x),否则 Git 无法运行
- pre-commit 等钩子中避免执行耗时过长的操作,会影响开发体验
- Husky 只管理客户端钩子,服务端钩子需要在远程仓库服务器上配置
- 钩子脚本中的路径是相对于 .git/hooks/ 目录的
Git Hooks 是实现团队规范化、自动化的重要工具,合理利用能显著提升代码质量和协作效率。