工程化配置 git commit 规范

工程化配置 git commit 规范

如果你团队的 git commit 信息紊乱,太过糟糕,觉得有必要统一规范 commit格式,又或者你是一个强迫症患者,有必要让 commit 信息整整齐齐的展示。那么,你可以往下瞅瞅。

本文使用的插件版本

pkg
1
2
3
4
5
6
{
"@commitlint/cli": "^12.0.1",
"@commitlint/config-conventional": "^12.0.1",
"husky": "4.3.8",
"standard-version": "^9.1.1"
}

git commit 规范格式

现在比较大众化的 commit 格式无非有两种:

git
1
2
$ <commit-type>[(commit-scope)]: <commit-message>
$ <commit-icon>: <commit-message>
  • <commit-type> 常见为:

    • chore:构建配置相关。
    • docs:文档相关。
    • feat:添加新功能。
    • fix:修复 bug。
    • perf:性能相关。
    • refactor:代码重构,一般如果不是其他类型的 commit,都可以归为重构。
    • revert:分支回溯。
    • style:样式相关。
    • test:测试相关。
  • [(commit-scope)] 可选,表示范围,例如:refactor(cli),表示关于 cli 部分的代码重构。

  • <commit-message> 提交记录的信息,有些规范可能会要求首字母大写。

  • <commit-icon> 用图标来替代 <commit-type> 所表示的功能。

具体规范信息格式在这里查看(这里不做过多阐述)

用于 commit 规范的工具

本文主要讲述第二种(commitlint)使用方法,如想使用更多请查看demo

commitlint 使用

yarn
1
$ yarn add @commitlint/config-conventional @commitlint/cli --D

在专门的 commitlint 配置文件 commitlint.config.js 中配置如下:

commitlint.config.js
1
2
3
module.exports = {
extends: ['@commitlint/config-conventional'],
};

类似于 eslintcommitlint 还支持类似于 .commitlintrc.js.commitlintrc.json.commitlintrc.yml 名称的配置文件,又或者在 package.json 中添加 commitlint 字段。

然后安装 husky,这是为了添加 git hooks,使得 git commit 也能够符合 commit 规范。

yarn
1
$ yarn add husky --dev

package.json 中配置 husky 钩子:

(v1.0.1版本以后为HUSKY_GIT_PARAMSv0.14.3GIT_PARAMS)

package.json
1
2
3
4
5
6
7
{
"husky": {
"hooks": {
"commit-msg": "commitlint -e $HUSKY_GIT_PARAMS"
}
}
}

上面的操作如果都成功的话,那么你使用 git commit 命令时,就必须老老实实的使用符合 commitlint 规范的信息了

standard-version 使用

yarn
1
$ yarn add standard-version -D

standard-version是帮助项目自动生成ChangeLog、升版本、打tag的工具,它基于semverConventional Commits规范。(PS:配合git commit规范化食用更加。

当执行server-version命令后,它会自动完成以下操作:

  1. 取得当前版本(比如package.json里面的version字段),升版本:1.0.0 => 1.1.0 或者 1.0.0 => 2.0.0等(如何升级可以由参数控制)
  2. 基于commits生成ChangeLog文件
  3. 提交一个commit,包含ChangeLog和版本变更的文件
  4. tag

以上功能都是可配置跳过的,对应:bumpchangelogcommittag。比如在配置文件中按照如下配置,就可以跳过打tag操作:

1
2
3
4
5
{
"skip": {
"tag": true
}
}

standard-version添加配置有两种方式:

image-20210331153823802

目前使用的配置文件如下,其它配置参考官方文档

.versionrc.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// https://github.com/conventional-changelog/conventional-changelog-config-spec/blob/master/versions/2.1.0/README.md
module.exports = {
// 跳过一些操作 bump、changelog、commit、tag
skip: {
// 不跳过打tag操作
tag: false,
},
//types为Conventional Commits标准中定义,目前支持
//https://github.com/conventional-changelog/commitlint/tree/master/%40commitlint/config-conventional
types: [
{ type: 'feat', section: '新特性' },
{ type: 'fix', section: 'Bug修复' },
{ type: 'docs', section: '文档' },
{ type: 'chore', section: '配置项', hidden: true },
{ type: 'style', section: '格式', hidden: true },
{ type: 'refactor', section: '重构', hidden: true },
{ type: 'perf', section: '性能', hidden: true },
{ type: 'test', section: '测试', hidden: true },
{ type: 'build', section: '构建', hidden: true },
{ type: 'ci', section: 'CI', hidden: true },
{ type: 'revert', section: '回滚', hidden: true },
],
//compare 链接 推荐自行修改为仓库地址 如
compareUrlFormat: '{{host}}/{{owner}}/{{repository}}/compare/{{previousTag}}...{{currentTag}}',
//hash链接 推荐自行修改为仓库地址 如 https://github.com/MrSeaWave/commit-standard-demo/commit/{{hash}}
commitUrlFormat: '{{host}}/{{owner}}/{{repository}}/commit/{{hash}}',
//issue链接
issueUrlFormat: '{{host}}/{{owner}}/{{repository}}/issues/{{id}}',
//server-version自动commit的模板
releaseCommitMessageFormat: 'build: v{{currentTag}}版本发布',
//需要server-version更新版本号的文件
bumpFiles: [
{
filename: 'MY_VERSION_TRACKER.txt',
// The `plain-text` updater assumes the file contents represents the version.
type: 'plain-text',
},
{
filename: 'package.json',
// The `json` updater assumes the version is available under a `version` key in the provided JSON document.
type: 'json',
},
],
};

package.json 配置:

package.json
1
2
3
4
5
6
7
8
"scripts": {
...,
"release": "standard-version",
"release:major": "standard-version --release-as major",
"release:minor": "standard-version --release-as minor",
"release:patch": "standard-version --release-as patch",
"release:prerelease": "standard-version --prerelease"
}

PS: standard-version 有很多其他的特性,这里不过多涉及, 有兴趣的可以自行尝试。也可以查看此demo

参考链接

作者

Sea

发布于

2021-03-31

更新于

2023-01-10

许可协议

评论