Git Hooks 自动化工作流配置

小飞兽 工具&效率 394 次阅读 2026-07-23

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 是实现团队规范化、自动化的重要工具,合理利用能显著提升代码质量和协作效率。