githook-分支与提交信息校验

Branch校验

validate-branch-name

安装

1
npm i husky validate-branch-name --save-dev

Husky requires Node >= 8.6.0 and Git >= 2.13.2
Husky version >= 1.0.0
笔记时validate-branch-name版本为1.0.4

配置

1
2
3
4
5
6
7
8
9
10
11
12
// package.json
{
"husky": {
"hooks": {
"pre-push": "validate-branch-name"
}
},
"validate-branch-name": {
"pattern": "^(master|develop){1}$|^(feature|fix|hotfix|release)\/.+$",
"errorMsg": "branch format error."
}
}

Message校验

优雅的提交你的 Git Commit Message

安装

1
2
npm install --save-dev @commitlint/{cli,config-conventional}
npm install --save-dev husky

配置

支持以下格式的配置文件:.commitlintrc.js, .commitlintrc.json, or .commitlintrc.yml file or a commitlint field in package.json.

比如我们在项目目录下创建配置文件.commitlintrc.js, 写入:

1
2
3
4
5
6
7
module.exports = {
extends: [
'@commitlint/config-conventional'
],
rules: {
}
};

**结合husky**,package.json中添加如下:

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

Passing husky’s HUSKY_GIT_PARAMS to commitlint via the -E|--env flag directs it to the relevant edit file. -e would default to .git/COMMIT_EDITMSG.

Message辅助填写

优雅的提交你的 Git Commit Message

Commitizen: 替代你的 git commit

它提供的 git cz 命令替代我们的 git commit 命令, 帮助我们生成符合规范的 commit message.

cz-conventional-changelog (一个符合 Angular团队规范的 preset). 使得 commitizen 按照我们指定的规范帮助我们生成 commit message.

全局安装

1
2
npm install -g commitizen cz-conventional-changelog
echo '{ "path": "cz-conventional-changelog" }' > ~/.czrc #意思是home目录下新建.czrc文件,内容为{ "path": "cz-conventional-changelog" }

使用

git cz替代git commit命令即可。

推荐规范说明

目前规范使用较多的是 Angular 团队的规范, 继而衍生了Conventional Commits specification. 很多工具也是基于此规范, 它的message格式如下:

1
2
3
4
5
<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>

通过 git commit 命令带出的 vim 界面填写的最终结果应该类似如上这个结构, 大致分为三个部分(使用空行分割):

标题行: 必填, 描述主要修改类型和内容

主题内容: 描述为什么修改, 做了什么样的修改, 以及开发的思路等等

页脚注释: 放 Breaking ChangesClosed Issues

分别由如下部分构成:

type: commit 的类型

feat: 新特性

fix: 修改问题

refactor: 代码重构

docs: 文档修改

style: 代码格式修改, 注意不是 css 修改

test: 测试用例修改

chore: 其他修改, 比如构建流程, 依赖管理.

scope: commit 影响的范围, 比如: route, component, utils, build…

subject: commit 的概述, 建议符合 50/72 formatting

body: commit 具体修改内容, 可以分为多行, 建议符合 50/72 formatting

footer: 一些备注, 通常是 BREAKING CHANGE 或修复的 bug 的链接.

这样一个符合规范的 commit message, 就好像是一份邮件。

拓展阅读1:自定义校验规则、辅助规则

也许 Angular 的那套规范我们不习惯, 那么可以通过指定 Adapter cz-customizable 指定一套符合自己团队的规范.

安装

1
2
3
npm i -g cz-customizable
#or
npm i -D cz-customizable

修改 .czrc 或 package.json

1
2
3
4
5
6
7
8
9
10
11
// .czrc
{ "path": "cz-customizable" }
// 或者
// package.json
{
"config": {
"commitizen": {
"path": "node_modules/cz-customizable"
}
}
}

自定义规则

~/ 或项目根目录下创建 .cz-config.js 文件, 维护你想要的格式,比如: leohxj/.cz-config

对自定义规则的校验

如果你使用的是自定义的 commitizen adapter, 那么你需要修改commitlint的校验配置为commitlint-config-cz

1
npm i -D commitlint-config-cz

.commitlintrc.js修改为:

1
2
3
4
5
6
7
module.exports = {
extends: [
'cz'
],
rules: {
}
};

拓展阅读2:standard-version 自动生成 CHANGELOG

通过以上工具的帮助, 我们的工程 commit message 应该是符合 Angular团队那套, 这样也便于我们借助 standard-version 这样的工具, 自动生成 CHANGELOG, 甚至是 语义化的版本号(Semantic Version).