规范Git Commit Message

前言

git想必大家都不陌生,基本上是作为现代开发的必备工具之一。代码同步快捷方便,分支无缝切换,在代码管理上无出其右。
然而你用的有多爽,代价就有多痛。
想当年大片大片的no message,update,commit,那也是相当壮观,找个代码花点时间那也不在话下。
但是随着前端越来越趋近工程话,一个项目也不在是一个人的事,协同开发,模块开发,已是大势所趋。
既然要协同要分离甚至是组合,那对于你单次提交内容的准确性,要求就越来越高。你需要将你写了什么代码什么功能,及哪个版本,具体做了什么,都得写上,以便他人合并或者分离你的代码,进行开发。
因此设计一个合理的适合自己项目的规范,就势在必行。
前端的message规范方面网上有很多,我就不再赘述。
本篇主要讲怎么一步一步设计自己项目的message规范。

统一提交格式

首先统一git的基础提交格式
<type>(<scope>): <subject>

关于git commit message的相关格式规范网上有很多,这里参考Angular提交规范
参考:Angular提交规范(英文原文档) 【翻译】AngularJS Git 提交信息规范

原理

使用 git 强制校验提交的 message 是否符合规范,我们使用 git hooks 能力来限制提交,主要使用 commit-msg 钩子。

主要工具

使用安装

第一步

1
2
## 安装 commitlint 相关
npm install --save-dev @commitlint/cli @commitlint/config-conventional

第二步

1
2
3
4
## 安装husky
npm install husky --save-dev
## or
yarn add husky --dev

第三步

1
2
3
4
## 激活hooks
npx husky install
## or
yarn husky install

第四步
项目根目录创建commitlint 配置文件(commitlint.config.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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/**
* commitlint.config.js
* 详细配置规则参考
* 规则解析:
* https://github.com/conventional-changelog/commitlint/blob/master/docs/reference-rules.md
* 完整规则示例:
* https://github.com/conventional-changelog/commitlint/blob/master/@commitlint/config-conventional/index.js
*/
module.exports = {
extends: ["@commitlint/config-conventional"],
rules: {
/**
* subject加上英文大小写规范限制
* - 禁止使用'sentence-case', 'start-case', 'pascal-case', 'upper-case'
* ep:
* 'subject-case': [
* 2,
* 'never',
* ['sentence-case', 'start-case', 'pascal-case', 'upper-case'],
* ]
* - 解除限制
* ep:
* 'subject-case': [0]
*/
"subject-case": [0],
/**
* scope是否允许为空
*
* - scope不允许为空
* ep:
* 'scope-empty': [2, 'never']
*
* - scope允许为空
* ep:
* 'scope-empty': [0]
*/
"scope-empty": [2, "never"],
/**
* type类型限定
* - 只允许feat,fix,docs类型
* ep:
* 'type-enum': [
* 2,
* 'always',
* [ 'feat','fix', 'docs',]
* ]
*/
"type-enum": [
2,
"always",
[
"feat",
"fix",
"docs",
"style",
"refactor",
"perf",
"test",
"chore",
"revert",
"merge",
"sync",
],
],
},
};

在.husky目录下创建 commit-msg 文件(.husky/commit-msg)

1
2
3
4
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

npx --no-install commitlint --edit $1

测试

最后测试 commitlint 规范是否生效

1
2
##生成项目以前提交中的问题
npx commitlint -- --from HEAD~1 --to HEAD --verbose

如果安装成功,输出大致如下(如果存在不符合规范的commit message)

1
2
3
4
5
6
7
8
9
...
⧗ input: Initial commit
✖ subject may not be empty [subject-empty]
type may not be empty [type-empty]
✖ scope may not be empty [scope-empty]

✖ found 1 problems, 0 warnings
ⓘ Get help: https://github.com/conventional-changelog/commitlint/#what-is-commitlint
...

安装完成即会对该项目下的git提交,都进行message规范校验。

说明

  • 主要使用commitlint来做规则制定,更多详细文档,见官网
  • 不要使用以下官网代码来生成配置文件,在window下会有编码格式问题
    echo "module.exports = { extends: ['@commitlint/config-conventional'] };" > commitlint.config.js
  • 不要使用husky生成commit-msg文件
    npx husky add .husky/commit-msg 'npx --no-install commitlint --edit $1