使用Angular Convention:规范Git Message信息

162 阅读3分钟

前言

本文主要介绍Angular Convention的git message规范,以及本人在使用IDEA进行开发时采用的一套实践标准。完整实践流程:通过IDEA插件生成本次的提交消息,在此基础上通过git hooks来捆绑一些通用的信息,比如分支名字。

Angular 团队制定的 Commit Message 规范是前后端领域最广泛采用的提交约定之一,它通过标准化提交信息实现以下目标:

  • 自动生成可读的 CHANGELOG
  • 驱动语义化版本(SemVer)
  • 提高团队协作效率
  • 便于追踪代码变更历史

使用Angular Convention可以达到如下规范价值:

  1. 版本管理

    • feat → 触发MINOR版本升级
    • fix → 触发PATCH版本升级
    • BREAKING CHANGE → 触发MAJOR版本升级
  2. 代码审查
    通过类型快速识别提交目的:

    feat: 需要关注功能实现
    fix: 需要验证Bug是否修复
    refactor: 警惕潜在逻辑变更
    
  3. 历史追溯
    可通过类型/作用域过滤提交记录:

    git log --grep="^feat(router):"
    

1. 核心格式

每条提交信息必须遵循以下结构:

<type>(<scope>): <subject>
<空行>
<body>
<空行>
<footer>

1.1 头部(Header)

1.1.1 类型(Type)必填

类型说明版本影响
feat新增功能MINOR (v0.X.0)
fixBug修复PATCH (v0.0.X)
docs文档更新-
style代码样式调整(空格、格式化等)-
refactor代码重构(非功能变更)-
perf性能优化PATCH
test测试代码变更-
build构建系统或依赖更新-
ciCI配置变更-
chore杂项任务(非代码变更)-
revert回滚某次提交-

1.1.2 作用域(Scope)可选

指定修改的影响范围,例如:

  • compiler
  • router
  • core
  • http
  • animations

1.1.3 主题(Subject) 必填

  • 简明描述(50字符内)
  • 首字母小写
  • 不使用句号结尾
  • 使用命令式语气(如"add"而非"added")

示例

feat(router): add dynamic route preloading

1.2 正文(Body) 可选

  • 详细说明修改动机实现方式
  • 每行不超过72字符
  • 使用空白行分隔段落

示例

feat(compiler): support TypeScript 4.9

- Upgrade parser to handle satisfies operator
- Add AST transformer for new syntax
- Update type checking rules

1.3 页脚(Footer) 可选

1.3.1 关联Issue
Closes #123, #245
Fixes #110
1.3.2 BREAKING CHANGE

标明不兼容变更,必须以BREAKING CHANGE:开头:

BREAKING CHANGE: 
  - `ViewChild` now requires static flag
  - Drop support for Node.js 12

2. 完整示例

2.1 带BREAKING CHANGE的功能提交

feat(core): implement new renderer API

Introduce Ivy renderer as default engine with 
backward compatibility layer.

BREAKING CHANGE:
  - Compiler output format changed to `ɵ` prefixed fields
  - `Renderer` class is now deprecated

Closes #500

2.2 简单修复提交

fix(http): prevent memory leak in interceptors

Clear subscription when HttpClient is destroyed.
Adds unsubscribe logic in interceptor chain.

Fixes #112

3. IDEA实战使用

在实际项目中,本人采用的IDEA插件结合Git hooks方法来规范代码提交记录

3.1 IDEA插件-Git Commit Message Helper

该插件是源自git-commit-template的加强版,添加一系列个性化的配置

git commit message helper.gif

3.2 Git Hooks实现message自定义处理

实现代码被真正提交时,附带一些通用的信息,如代码分支名称

  1. 进入项目的 .git/hooks 目录
cd your-project/.git/hooks
  1. 创建/修改 prepare-commit-msg 文件
touch prepare-commit-msg && chmod +x prepare-commit-msg
  1. 自定义文件内容:如提取分支名称中的某个数字串
#!/bin/sh
BRANCH_NAME=$(git symbolic-ref --short HEAD)
BRANCH_NUMBER=$(echo "$BRANCH_NAME" | grep -oE 'branch-[0-9]{6}' | grep -oE '[0-9]{6}')

# 自动生成消息前缀(如果找到编号则添加,否则不加)
if [ -n "$BRANCH_NUMBER" ]; then
  echo "[branch-${BRANCH_NUMBER}] $(cat "$1")" > "$1"
fi

3.3 实际效果

假设分支名是:f-branch-276914 则效果如下所示:被模糊的地方刚好是上面对应的branch

git commit message helper log.png

参考资料