在多人协作开发中,统一规范的提交信息不仅能提高代码审查质量,还能为自动化发布、持续集成和变更日志生成提供基础保障。本指南将介绍如何通过 Git Hooks 自动校验提交信息格式。
🎯 为什么需要规范 Git 提交信息?
规范的 Git 提交信息能带来显著的效益:
✅ 团队协作一致性:每个人都用一样的规范写 commit,减少沟通成本
✅ 提升可读性:一眼看出本次提交的类型和影响范围
✅ 便于代码审查:审查者能快速了解改动意图
✅ 支持自动化流程:基于 commit 信息自动发版和生成变更日志
✅ 团队协作一致性:统一的规范减少沟通成本
提交信息格式规范
基本格式
<type>(<scope>): <subject>
格式说明
- type:变更类型(必填)
- scope:影响模块/子系统(可选但推荐)
- subject:简短描述(必填)
正确示例
feat(login): 添加微信登录功能
fix(utils): 修复空指针异常
docs(readme): 更新安装说明
chore: 更新依赖版本
支持的提交类型
| 类型 | 图标 | 说明 |
|---|---|---|
feat | 💡 | 新功能开发 |
fix | 🐛 | Bug 修复 |
docs | 📝 | 文档更新(README、注释等) |
style | 💅 | 代码格式调整(空格、换行等,不涉及逻辑) |
refactor | 🔧 | 代码重构(既不是新功能也不是修复) |
test | ✅ | 测试代码的添加或修改 |
chore | 🔩 | 构建脚本、依赖更新等杂项任务 |
perf | 🚀 | 性能优化 |
ci | 🛠 | 持续集成配置修改 |
build | 🏗️ | 构建系统相关变动 |
revert | ↩️ | 回退之前的提交 |
Scope 命名规范
scope 应该使用小写字母、数字、连字符或下划线,表示影响的模块或功能区域:
常用分类示例
| 分类 | 示例 | 说明 |
|---|---|---|
| 业务模块 | login, signup, cart, order, payment | 具体业务功能区域 |
| UI组件 | button, dialog, form, input, table | 界面组件层面的变动 |
| 工具类 | utils, http, config, theme | 工具函数、配置等 |
| 架构模块 | api, model, repository, viewmodel | 代码目录或逻辑层 |
| 构建部署 | build, ci, docker, scripts | 脚本、构建系统等 |
| 文档 | readme, docs, license | 文档相关改动 |
| 测试 | test, unit-test, integration-test | 测试代码 |
自动校验脚本配置
安装步骤(macOS/Linux)
-
进入项目的 Git Hooks 目录
cd your_project/.git/hooks -
创建 commit-msg 钩子文件
# 如果存在 commit-msg.sample,需要重命名 mv commit-msg.sample commit-msg # 或者直接创建新文件 touch commit-msg chmod +x commit-msg -
编辑钩子文件
nano commit-msg
校验脚本代码
#!/bin/sh
# Git commit-msg hook - 校验提交信息格式
# 格式要求: <type>(<scope>): <subject>
commit_msg_file="$1"
commit_msg=$(head -n1 "$commit_msg_file")
# 支持的提交类型
types="feat|fix|docs|style|refactor|test|chore|perf|ci|build|revert"
# 校验正则表达式
# 格式: type(scope): subject 或 type: subject
pattern="^(${types})(\([a-zA-Z0-9_-]+\))?: .+"
if ! echo "$commit_msg" | grep -Eq "$pattern"; then
echo ""
echo "❌ 提交信息格式错误!"
echo "---------------------------------------"
echo "✅ 正确格式:<type>(<scope>): <subject>"
echo "✅ 示例:feat(login): 添加微信登录功能"
echo ""
echo "📋 支持的提交类型:"
echo " feat 💡 新功能开发"
echo " fix 🐛 Bug 修复"
echo " docs 📝 文档更新"
echo " style 💅 格式调整"
echo " refactor 🔧 代码重构"
echo " test ✅测试相关"
echo " chore 🔩 杂项任务"
echo " perf 🚀 性能优化"
echo " ci 🛠 CI/CD 配置"
echo " build 🏗️ 构建系统"
echo " revert ↩️ 回退提交"
echo ""
echo "📌 scope 命名建议:"
echo " 业务模块: login, cart, order"
echo " UI组件: button, dialog, form"
echo " 工具类: utils, config, api"
echo "---------------------------------------"
exit 1
fi
exit 0
使用效果展示
正确提交示例
$ git commit -m "feat(auth): 添加JWT认证功能"
[main a1b2c3d] feat(auth): 添加JWT认证功能
错误提交示例
$ git commit -m "add login feature"
❌ 提交信息格式错误!
---------------------------------------
✅ 正确格式:<type>(<scope>): <subject>
✅ 示例:feat(login): 添加微信登录功能
...
其他方式
你也可以安装Android studio plugin 插件进行提交检验,由于笔者习惯使用命令行的方式,所以没有使用。至于市面上其他的方式如node.js 中安装xxx 方式,个人觉得没有这种必要。当然你也可以使用。
最佳实践建议
编写高质量提交信息的技巧
- 保持简洁明了:主题行控制在50字符以内
- 使用动词开头:如"添加"、"修复"、"更新"
- 描述做了什么,而不是怎么做:关注变更的结果
- 保持一致性:团队内统一使用中文或英文
- 避免无意义的信息:如"修改"、"更新"等模糊描述
团队协作建议
- 制定团队规范:在项目README中说明提交信息规范
- 定期回顾:在代码审查时检查提交信息质量
- 工具集成:配置IDE插件或命令行工具辅助编写
- 持续改进:根据项目特点调整type和scope分类
常见问题解答
Q: 钩子脚本不生效怎么办?
Q: mac中修改完成之后没有起作用?
A: 检查脚本是否内容是否正确,检查文件权限是否设置正确(chmod +x commit-msg),确保文件名为commit-msg而非commit-msg.sample。
Q: 如何在现有项目中推广? A: 可以先在新分支中配置,团队讨论后再合并到主分支,同时提供培训和文档支持。
Q: 是否可以自定义type类型? A: 可以修改脚本中的types变量,但建议遵循约定式提交规范以保持通用性。
通过以上配置,就能拥有统一、规范的Git提交历史,为项目的长期维护和自动化流程奠定坚实基础。