同一个工程项目,为了方便管理,git 的 commit 信息最好按照必定的格式规范,以便在须要的时候方便使用。什么是方便的时候,好比出现了一个线上 bug,因此须要回滚操做,知道了提交信息能够方便的定位问题。代码 review 的时候也知道了该次 commit 干了什么,因此 commit 标准化好处不少,再也不举例。node
能够立刻想到的是利用 shell 结合 git hook 实如今 git commit 阶段检查输入是否符合规范。符合就经过,不符合就终止,并给出提示信息。webpack
常见的分类有下面几种:git
在 github 上有 commitlint 这个项目,它能够很方便的在工程中作配置,并容许你自定义上面说的「规范」、「分类」。github
commitlint:用于检查提交信息 husky:hook 工具,用于 git-commit 和 git-push 阶段。web
怎么用?shell
npm init -y
npm install --save-dev @commitlint/config-conventional @commitlint/cli husky
commitlint.config.js
。const types = [
'build',
'ci',
'chore',
'docs',
'feat',
'fix',
'pref',
'refactor',
'revert',
'style',
'test'
];
typeEnum = {
rules: {
'type-enum': [2, 'always', types]
},
value: () => types
}
module.exports = {
extends: [
"@commitlint/config-conventional"
],
rules: {
'type-case': [0],
'type-empty': [0],
'scope-empty': [0],
'scope-case': [0],
'subject-full-stop': [0, 'never'],
'subject-case': [0, 'never'],
'header-max-length': [0, 'always', 72],
'type-enum': typeEnum.rules['type-enum']
}
};
复制代码
"husky": {
"hooks": {
"pre-commit": "echo '哈喽,小伙伴们,在这里能够作测试相关的逻辑哦,通常结合公司的 ci'",
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS",
"pre-push": "echo 提交代码前须要先进行单元测试 && 能够作测试相关"
}
}
复制代码
上面的流程配置完成,当你在提交 commit 信息的输入的内容,若是不符合 <type>: <subject>
规则,会终止并给出提示信息。npm
type 就是上面的种类;subject 就是须要提交的文字归纳。好比:feature:增长摇一摇推荐酒店功能。json
小说明:若是某次提交想禁用 husky,能够添加参数 --no-verify。git commit --no-verify -m "xxx"
xcode
贴个效果图工具
安装包 husky 的时候,会在目录 .git/hooks/
下生成一堆 shell 脚本,负责 git 的 hook。
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
这个配置告诉 git hooks,当执行 git commit -m
的时候触发 commit-msg 钩子,并通知 husky,从而执行 commitlint -E HUSKY_GIT_PARAMS
,实际上执行的是 ./node_modules/husky/bin/run.js
,读取 commitlint.config.js 里的配置,而后对咱们 commit -m 里的字符串校验,如不经过则输出错误信息并终止。
git commit 的几个钩子,也暴露出来了,因此能够结合时机作一些额外的逻辑。
因此基于上述时机,能够根据项目特色作一些别的事情。好比 code lint、unit test 代码覆盖率检测、changelog 自动生成、unit test 脚本等、也能够借此机会产生 lint 报表