怎么使用 Git hook 实现提交前自动代码风格检查

文章导读
直接在本地配置 pre-commit hook 是最快见效的方式,适合个人开发环境或小型团队快速落地规范。
📋 目录
  1. A 命令速用版
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
  6. F 参考来源
A A

直接在本地配置 pre-commit hook 是最快见效的方式,适合个人开发环境或小型团队快速落地规范。

先说结论:本地 Hook 能提供即时反馈,但不能替代服务端校验,最好两者结合。

  • 适合 个人开发机或强规范团队,减少 Code Review 中的格式争论
  • 先看 现有工具链语言匹配度,Python 常用 pre-commit,前端常用 husky
  • 建议 配合 CI 流程双重保险,防止有人绕过本地检查

命令速用版

如果你只是想快速测试原生 Git Hook 是否工作,可以在项目根目录执行以下命令创建一个简单的拦截脚本:

cat > .git/hooks/pre-commit << 'EOF'
#!/bin/sh
echo "Running style check..."
# 在这里填入你的检查命令,例如 npm run lint
exit 0
EOF
chmod +x .git/hooks/pre-commit

为什么会这样

Git Hook 本质是 Git 在特定事件发生时自动执行的脚本。pre-commit 钩子会在你运行 git commit 之后、提交信息编辑器启动之前触发。如果脚本返回非零退出码,Git 会中止提交过程。这种机制让开发者能在代码进入版本历史前立刻发现问题,而不是等到推送代码后由 CI 报错。

分步处理

1. 选择工具方案
选择依据主要是语言生态:Python 项目首选 pre-commit,Node.js 项目首选 husky。

怎么使用 Git hook 实现提交前自动代码风格检查

2. 配置检查规则(Python/pre-commit 示例)
在项目根目录创建 .pre-commit-config.yaml 文件,配置如下:

repos:
  - repo: https://github.com/psf/black
    rev: 23.1.0
    hooks:
      - id: black
  - repo: https://github.com/pycqa/flake8
    rev: 6.0.0
    hooks:
      - id: flake8

3. 配置检查规则(Node.js/husky 示例)
安装 husky 并配置 package.json:

npm install husky `--save-dev`
npx husky install
npx husky add .husky/pre-commit "npm run lint"

4. 安装钩子
运行框架提供的安装命令,它会自动将脚本链接到 .git/hooks 目录并赋予执行权限。不要手动修改 .git/hooks 下的文件,因为 git clone 不会版本化该目录。

怎么使用 Git hook 实现提交前自动代码风格检查
# pre-commit 用户
pre-commit install

# husky 用户通常在 package.json 中配置 prepare 脚本自动安装
npm pkg set scripts.prepare="husky install"

怎么验证是否生效

故意制造一个风格错误,例如在要求缩进为 2 空格的文件中写入 4 空格,然后尝试 git commit。如果配置正确,终端会输出检查失败信息,且提交被中断。修复错误后再次提交,应该能顺利通过。

常见坑

1. 绕过检查:开发者可以使用 git commit `--no-verify` 跳过钩子,所以关键检查必须在服务端 CI 再跑一次。

2. 权限问题:在 Windows 环境下,有时脚本无法获得执行权限,导致钩子不触发。需要确认 git 配置 core.filemode 或手动提权。

3. 速度过慢:如果检查脚本耗时过长,会打断开发心流。建议只对暂存区文件进行检查,不要全量扫描。

参考来源

  • Git 官方文档 - githooks 页面:https://git-scm.com/docs/githooks
  • pre-commit 框架文档:https://pre-commit.com/
  • husky 文档:https://typicode.github.io/husky/