git提交代码前都需要使用git commit
命令对本次提交进行说明,但是很多人平时可能并不重视这个环节,导致commit记录写的很随意,没有发挥其意义与价值。
在网络上浏览一圈后发现有一种Angular团队规范比较受大家欢迎(效果见下图),并且有一套完善的工具链Commitizen + cz-conventional-changelog/cz-customizable + Commitlint + Husky
帮大家进行commit的格式控制和git提交前门禁检查。
这里将我安装这套工具的过程记录下,便于以后查找。
Commitizen
commitizen是一个帮助规范commit message的工具,它可以帮我们控制 commit 的格式,并让提交复杂格式时比git commit -m
更加容易,使用它提交git commit的样子如下图:
基本使用:
安装 commitizen :
npm install -g commitizen
安装好后,需要安装一个adapter来定义希望使用的 commit message 格式。如果使用上面的 anjular 的规范,可以使用cz-conventional-changelog
这个 adapter 。通过 commitizen 提供的命令行工具去初始化项目中希望使用的 adapter 。在项目目录下执行:
commitizen init cz-conventional-changelog --save-dev --save-exact
这个命令会帮我们在项目中安装 cz-conventional-changelog 并在 package.json 中添加如下内容:
"config": {
"commitizen": {
"path": "./node_modules/cz-conventional-changelog"
}
}
之后,全局安装了 commitizen 的朋友就可以通过git cz
命令代替git commit
命令,从而调出如下图的界面,根据界面提示输入 commit 信息并提交。
当然,如果不想使用全局安装,例如希望项目中其他成员不用本地安装 commitzen 就能直接使用同一套工具和配置,可以将 commitizen 和它的 adapter(如:cz-conventional-changelog) 安装到项目本地,使用npx git-cz
或者配置 package.json 中 scripts 。这在 github主页上也有详细方法说明。
定制和拓展:
上面的配置可以让我们简单方便的使用 commitzen 工具规范 commit 信息,但实际中很多项目会有不同的规范,对此 commitizen 有各种 adapter 来提供一些可定制的格式。例如下面介绍的cz-customizable,这也是 commitizen 的一个 adapter ,格式类似上面的 cz-conventional-changelog ,但提供一定程度的自定义。
anjular规范的格式如下:
<type>(<scope>): <subject>
// 空一行
<body>
// 空一行
<footer>
……
cz-customizable 自定义配置可以对上面的 type、scope、subject、body等进行设置与限定,例如设置type的种类、subject的字数、body的换行符等。方法是在项目根目录下新建 .cz-config.js
配置文件,在该文件中对上述字段设置规则。官方github上有给出该文件写法的一个示例。还有我自己参照网上示范写的一个配置例子如下:
'use strict';
module.exports = {
types: [
{ value: 'WIP', name : '🚧 WIP: 开发中' },
{ value: 'feat', name : '✨ feat: 一个新特性' },
{ value: 'improvement', name : '➕ improvement: 对现有特性的提升' },
{ value: 'fix', name : '🐛 fix: 修复Bug' },
{ value: 'refactor', name : '🛠 refactor: 代码重构,注意和特性、重构区分开' },
{ value: 'docs', name : '📚 docs: 变更文档' },
{ value: 'test', name : '🏁 test: 修改或添加测试文件' },
{ value: 'config', name : '📝 config: 修改或添加配置文件' },
{ value: 'style', name : '💅 style: 修改格式,不影响功能,例如空格、代码格式等' },
{ value: 'perf', name : '📈 perf: 性能提升' },
{ value: 'ci', name : '🔧 ci: 修改ci相关配置、脚本等' },
{ value: 'revert', name : '⏪ revert: 回退版本' },
{ value: 'chore', name : '🗯 chore: 杂务,不属于以上类型,例如run build、引入或更新软件包等' },
],
// scopes: [{ name: 'accounts' }, { name: 'admin' }, { name: 'exampleScope' }, { name: 'changeMe' }],
// allowTicketNumber: false,
// isTicketNumberRequired: false,
// ticketNumberPrefix: 'TICKET-',
// ticketNumberRegExp: '\\d{1,5}',
messages: {
type: '选择一种你的提交类型:',
scope: '选择修改涉及范围 (可选):',
// used if allowCustomScopes is true
customScope: '请输入本次改动的范围(如:功能、模块等):',
subject: '简短说明:\n',
body: '详细说明,使用"|"分隔开可以换行(可选):\n',
breaking: '非兼容性,破坏性变化说明 (可选):\n',
footer: '关联关闭的issue,例如:#31, #34(可选):\n',
confirmCommit: '确定提交说明?'
},
allowCustomScopes: true,
allowBreakingChanges: ["feat", "fix"], // 仅在feat、fix时填写破坏性更改
subjectLimit: 100, // limit subject length
breaklineChar: '|', // 设置body和footer中的换行符
};
这里我拓展了几个type类型,并对提示语进行了汉化。最后执行 git cz
的效果如下(这些emoji图标是从这个网站复制来的):
使用commitizen 工具提交 commit ,规范自己的 git commit message ,才能发挥出 git commit的作用和意义,对于团队开发和生成版本变更日志都很有帮助。但习惯又是也需要制度来监督。
Commitlint
commitlint是一个可以帮我们检查 git commit 所提交信息是否符合conventional commit format(也就是类似上面的格式)的工具,安装方法如下:
npm install --save-dev @commitlint/config-conventional @commitlint/cli
项目目录下创建 commitlint.config.js
文件并写入 module.exports = {extends: ['@commitlint/config-conventional']}
。这个文件就是配置文件,可以设置 commitlint 检查规则。具体规则可以参考这里。
我自己写的一个例子:
module.exports = {
extends: ['@commitlint/config-angular'],
rules: {
'type-enum': [
2,
'always',
[
'WIP', // 开发中
'feat', // 新特性
'improvement', // 加强现有特性
'fix', // 修补bug
'refactor', // 重构
'docs', // 文档
'test', // 单元测试
'config', // 配置文件
'style', // 格式需改
'perf', // 性能提升
'ci', // ci
'revert', // 版本回退
'chore', // 其他修改
],
],
'type-empty': [2, 'never'], // type不能为空
'type-case': [0, 'always', 'lower-case'], // type不限制大小写
'subject-empty': [2, 'never'], // subject(简短得描述)不能为空
'subject-max-length': [1, 'always', 50], // subject最大长度,超出只会警告,不阻止提交
'body-leading-blank': [1, 'always'],
'footer-leading-blank': [1, 'always'],
'header-max-length': [2, 'always', 72],
}
};
安装好 commitlint 工具后,可以使用该工具对 commit 信息手动检查,要是想每次 git 提交时自动执行检查,可以配合 husky。husky是一个可以帮我们设置 git hook 的工具,使用它为我们git commit
时添加一个hook,提交时就会触发这个hook,执行 commitlint 自动检查我们提交的 commit message,如果不符合规范,可以阻止提交。
使用husky方法:
npm install husky --save-dev
package.json 中添加:
"husky": {
"hooks": {
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
}
},
之后执行提交时就会自动触发 commitlint 工具并使用我们在 commitlint.config.js
中设置的规则检查提交的信息是否符合规范。