为什么使用仓库级钩子
只存在于某位开发者 .git/hooks 中的钩子对其他人不可见。pre-commit 框架把配置保存在仓库中、固定版本,并在每个克隆中安装钩子。
repos:
- repo: local
hooks:
- id: lint
name: lint
entry: npm run lint
language: system
pass_filenames: false
- id: unit-tests
name: unit tests
entry: npx vitest run --changed
language: system
pass_filenames: false
步骤
- 在每台机器上安装框架:
pipx install pre-commit。 - 在仓库根目录创建
.pre-commit-config.yaml,用 local hook 调用项目自己的脚本和锁定的包管理器。 - 执行
pre-commit install && pre-commit run --all-files建立基线。 - 故意引入一个 lint 错误并尝试提交,确认钩子会阻止提交并显示失败原因。
验证
- 有 lint 错误的提交被拒绝。
- 干净的提交无需
--no-verify即可通过。 - 另一位开发者克隆仓库并执行
pre-commit install后得到相同检查。 - CI 仍运行同一组脚本;钩子只是快速本地过滤,不替代 CI。
范围与限制
保持钩子快速:格式化、lint、类型检查和单元测试适合放在钩子中;端到端、性能与集成测试留在 CI。钩子可以通过 --no-verify 绕过,因此 CI 必须保留权威门禁。如果钩子自动修复文件,需要重新暂存后再提交。