commit-msg 钩子是什么
commit-msg 是 Git 在生成提交信息之后、真正完成提交之前执行的钩子,传入的参数是保存提交信息的临时文件路径。把校验器接在这里,格式不合格的提交会直接被拒绝,规范就前移到了本地。钩子文件默认放在 .git/hooks 下,也可以用 core.hooksPath 统一指向项目内的目录,方便团队分发。注意钩子目录不受版本控制,需要额外的分发方案。
基本信息
| 钩子位置 | .git/hooks/commit-msg,或 core.hooksPath 指定目录 |
|---|---|
| 传入参数 | 保存提交信息的临时文件路径 |
| 执行时机 | git commit 生成信息之后、提交完成之前 |
| 拒绝方式 | 脚本以非零状态退出即可阻断提交 |
| 平台 | 需要可执行权限,跨平台需注意换行符 |
典型使用场景
- 团队统一提交格式,本地即时拦截不合规信息
- 校验提交信息包含必需的关联单号
- 检查标题长度与类型前缀是否符合约定
- 用统一目录管理多个项目的钩子脚本
- 新成员环境里通过钩子得到即时格式提示
- 排查提交被拒的原因,确认是校验还是其他钩子
钩子示例
钩子示例
#!/bin/sh
npx --no-install commitlint --edit "$1" # 校验提交信息文件
# 保存为 .git/hooks/commit-msg 并确保可执行
# chmod +x .git/hooks/commit-msg统一钩子目录
统一钩子目录
git config core.hooksPath .githooks # 指向项目内目录
git add .githooks/commit-msg # 钩子脚本入库便于分发
chmod +x .githooks/commit-msg常用钩子对照
| 钩子 | 时机 |
|---|---|
| pre-commit | 提交前,检查暂存内容 |
| commit-msg | 提交信息生成后,校验信息格式 |
| pre-push | 推送前,运行测试或检查 |
钩子不随克隆分发,需要每台机器安装或由工具框架统一管理;文件必须可执行,否则会静默不生效。
接入顺序建议
- 先把校验器跑通,确认单条提交能被正确判定
- 再写最小钩子脚本,手动执行一次验证可运行
- 最后用统一钩子目录入库,方便团队成员分发
- CI 中补一层校验作为兜底,防止本地绕过