文章目录
一、约定式提交规范
1.1 概述
约定式提交规范是一种基于提交信息的轻量级约定。 它提供了一组简单规则来创建清晰的提交历史; 这更有利于编写自动化工具。 通过在提交信息中描述功能、修复和破坏性变更, 使这种惯例与 SemVer
相互对应,官网直达。
提交说明的结构如下所示:
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
翻译过来就是:
<类型>[可选 范围]: <描述>
[可选 正文]
[可选 脚注]
如图:
提交说明包含了下面的结构化元素,以向类库使用者表明其意图:
fix
: 类型 为fix
的提交表示在代码库中修复了一个bug
(这和语义化版本中的PATCH
相对应)feat
: 类型 为feat
的提交表示在代码库中新增了一个功能(这和语义化版本中的MINOR
相对应)BREAKING CHANGE
: 在脚注中包含BREAKING CHANGE
: 或 <类型>(范围) 后面有一个!
的提交,表示引入了破坏性API
变更(这和语义化版本中的MAJOR
相对应)。 破坏性变更可以是任意 类型 提交的一部分- 除
fix: 和 feat:
之外,也可以使用其它提交 类型 ,例如@commitlint/config-conventional
(基于Angular
约定)中推荐的build:、chore:、 ci:、docs:、style:、refactor:、perf:、test:
等 - 脚注中除了
BREAKING CHANGE: <description>
,其它条目应该采用类似git trailer format
这样的惯例。
其它提交类型在约定式提交规范中并没有强制限制,并且在语义化版本中没有隐式影响(除非它们包含BREAKING CHANGE
)。 可以为提交类型添加一个围在圆括号内的范围,以为其提供额外的上下文信息。例如 feat(parser): adds ability to parse arrays.
。
1.2 规范
本文中的关键词·“必须(MUST)”、“禁止(MUST NOT)”、“必要(REQUIRED)”、“应当(SHALL)”、“不应当(SHALL NOT)”、“应该(SHOULD)”、“不应该(SHOULD NOT)”、“推荐(RECOMMENDED)”、“可以(MAY)” 和 “可选(OPTIONAL)”
,其相关解释参考RFC 2119
。
- 每个提交都必须使用类型字段前缀,它由一个名词构成,诸如
feat
或fix
, 其后接可选的范围字段,可选的!
,以及必要的冒号(英文半角)和空格
- 当一个提交为应用或类库实现了新功能时,必须使用
feat
类型。 - 当一个提交为应用修复了
bug
时,必须使用fix
类型。 - 范围字段可以跟随在类型字段后面。范围必须是一个描述某部分代码的名词,并用圆括号包围,例如:
fix(parser):
- 描述字段必须直接跟在
<类型>(范围)
前缀的冒号和空格之后。 描述指的是对代码变更的简短总结,例如:fix: array parsing issue when multiple spaces were contained in string
- 在简短描述之后,可以编写较长的提交正文,为代码变更提供额外的上下文信息。正文必须起始于描述字段结束的一个空行后
- 提交的正文内容自由编写,并可以使用空行分隔不同段落
- 在正文结束的一个空行之后,可以编写一行或多行脚注。每行脚注都必须包含 一个令牌
(token)
,后面紧跟:<space> 或 <space>#
作为分隔符,后面再紧跟令牌的值(受git trailer convention
启发) - 脚注的令牌必须使用
-
作为连字符,比如Acked-by
(这样有助于 区分脚注和多行正文)。有一种例外情况就是BREAKING CHANGE
,它可以被认为是一个令牌。 - 脚注的值可以包含空格和换行,值的解析过程必须直到下一个脚注的令牌
/
分隔符出现为止。 - 破坏性变更必须在提交信息中标记出来,要么在
<类型>(范围)
前缀中标记,要么作为脚注的一项 - 包含在脚注中时,破坏性变更必须包含大写的文本
BREAKING CHANGE
,后面紧跟着冒号、空格,然后是描述,例如:BREAKING CHANGE: environment variables now take precedence over config files
- 包含在
<类型>(范围)
前缀时,破坏性变更必须通过把!
直接放在:
前面标记出来。 如果使用了!
,那么脚注中可以不写BREAKING CHANGE:
, 同时提交信息的描述中应该用来描述破坏性变更 - 在提交说明中,可以使用
feat 和 fix
之外的类型,比如:docs: updated ref docs.
- 工具的实现必须不区分大小写地解析构成约定式提交的信息单元,只有
BREAKING CHANGE
必须是大写的 BREAKING-CHANGE
作为脚注的令牌时必须是BREAKING CHANGE
的同义词
1.3 好处
- 自动化生成 CHANGELOG。
- 基于提交的类型,自动决定语义化的版本变更。
- 向同事、公众与其他利益关系者传达变化的性质。
- 触发构建和部署流程。
- 让人们探索一个更加结构化的提交历史,以便降低对你的项目做出贡献的难度
二、Commitizen
从第一章中了解到约定式提交规范,我们知道如果严格按照约定式提交规范来手动进行代码的提交,那会是一件非常痛苦的事情,但是Git提交规范处理又势在必行,那如何处理呢?
接下来要介绍的commitizen
就是用来做Git提交规范化的工具,在保证代码按照规范提交的同时,又可以大大提高提交效率。
commitizen
仓库名为cz-cli,其提供了一个git cz
的命令来替代git commit
,简单介绍一句话介绍就是:
当使用commentizen
进行代码提交(git commit)
时,commitizen
会提交我们在提交时填写的所有必须的字段。
话不多说,直接上手体验下吧。
2.1 安装
通过如下命令安装commitizen
:
npm install commitizen -g
2.2 安装并配置cz-customizable依赖
2.2.1 安装依赖
在项目根目录下,安装cz-customizable
依赖,如下:
npm i cz-customizable -D
2.2.2 配置package.json
在packge.json
中添加刚安装的依赖,如下:
"config": {
"commitizen": {
"path": "node_modules/cz-customizable"
}
}
2.2.3 添加cz-config配置文件
在项目根目录下创建.cz-config.js
自定义提示文件,如下:
module.exports = {
// 可选类型
types: [
{ value: 'feat', name: 'feat: 新功能' },
{ value: 'fix', name: 'fix: 修复' },
{ value: 'docs', name: 'docs: 文档变更' },
{ value: 'style', name: 'style: 代码格式(不影响代码运行的变动)' },
{
value: 'refactor',
name: 'refactor: 重构(既不是增加feature,也不是修复bug)'
},
{ value: 'perf', name: 'perf: 性能优化' },
{ value: 'test', name: 'test: 增加测试' },
{ value: 'chore', name: 'chore: 构建过程或辅助工具的变动' },
{ value: 'revert', name: 'revert: 回退' },
{ value: 'build', name: 'build: 打包' }
],
// 消息步骤
messages: {
type: '请选择提交类型:',
customScope: '请输入修改范围(可选):',
subject: '请简要描述提交(必填):',
body: '请输入详细描述(可选):',
footer: '请输入要关闭的issue(可选):',
confirmCommit: '确认使用以上信息提交?(y/n/e/h)'
},
// 跳过问题
skipQuestions: ['body', 'footer'],
// subject文字长度默认是72
subjectLimit: 72
}
2.3 使用
此时,我们在提交代码时,就不需要再使用git commit
了,而是使用git cz
来执行,提交过程如下:
2.4 问题
借助commitizen
工具可以简单快捷完成代码规范化提交,新问题又来了,同一个团队的不同开发同学其提交不能保证都是符合规范的,那么如何保证团队都是符合规范提交呢?
这就需要借助于GitHooks
完成了,下篇文章来搞一下。