Git Hooks 配置指南

Git Hooks 配置指南

Git hooks 是在 Git 执行特定操作时自动运行的脚本,可以用于自动化开发流程、代码质量检查等。以下是常见的 Git hooks 配置方法和示例代码。

基本配置方法

  1. Git hooks 位于项目的 .git/hooks 目录中
  2. 默认有一些示例脚本(以 .sample 结尾)
  3. 要启用一个 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。

  1. 安装 Husky:
bash 复制代码
npm install husky --save-dev
  1. 在 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 框架:

  1. 安装:
bash 复制代码
pip install pre-commit
  1. 创建 .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
  1. 安装 hooks:
bash 复制代码
pre-commit install

注意事项

  1. 确保 hook 脚本有可执行权限:chmod +x .git/hooks/pre-commit
  2. 如果 hook 失败(非零退出码),Git 操作将中止
  3. 可以在 hook 中使用 git stash 来保存未提交的更改
  4. 对于团队项目,建议将 hooks 放在项目根目录的 hooks/ 文件夹中,然后使用 git config core.hooksPath hooks 来指定 hooks 路径

希望这些示例能帮助你配置 Git hooks!根据你的项目需求选择合适的 hook 和检查逻辑。