跳到主要内容

Git 钩子

Git钩子(Hooks)是在Git执行某些操作时自动运行的脚本。它们可用于自动化任务、执行检查、强制规范等。

钩子位置

钩子文件位于 .git/hooks 目录中。每个钩子都有对应的示例文件(以 .sample 结尾):

ls .git/hooks

钩子类型

1. 客户端钩子

在本地机器上运行,分为以下几类:

提交钩子

钩子说明阻止提交
pre-commit提交前运行可以
prepare-commit-msg提交信息编辑前运行
commit-msg提交信息编辑后运行可以
post-commit提交后运行

其他客户端钩子

钩子说明
pre-rebase变基前运行
post-checkoutcheckout后运行
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"

常用场景

  1. 代码质量检查:ESLint、Prettier
  2. 单元测试:提交前运行测试
  3. 提交信息规范:Conventional Commits
  4. 敏感信息检查:防止提交密钥/密码
  5. 自动修复:自动格式化代码

最佳实践

  • 保持钩子脚本快速执行
  • 提供清晰的错误信息
  • 钩子脚本纳入版本控制(Husky)
  • 允许跳过钩子(使用 --no-verify