从我的notion文档迁移到的博客园:[https://www.notion.so/Git-Commit-commitlint-husky-9cc381b35484437ca32f474cda40dc24)
一、缘起
- 规范前
- 规范后
二、工具介绍
1、commitlint
commitlint 是当前使用最为广泛的 git commit 校验约束工具之一,
commitlint helps your team adhering to a commit convention. By supporting npm-installed configurations it makes sharing of commit conventions easy.
(1)安装
npm install -g @commitlint/cli @commitlint/config-conventional
config-conventional是社区整理的常用的Commit规范,见如下
https://www.npmjs.com/package/@commitlint/config-conventional
(2)配置
生成commitlint.config.js配置文件,命令如下:
echo "module.exports = {extends: ['@commitlint/config-conventional']}" > commitlint.config.js
-
默认采用config-conventional:
module.exports = {extends: ['@commitlint/config-conventional']}; -
可自定义配置:
配置规则见 https://commitlint.js.org/#/reference-configuration
module.exports = { extends: ['@commitlint/config-conventional'], rules: { 'type-enum': [2, 'always', [ "feat", "upd", "del", "fix", "refactor", "test", "perf", "docs", "style", "revert" ]], 'subject-full-stop': [0, 'never'], 'subject-case': [0, 'never'] } };
2、husky
Husky can prevent bad git commit, git push and more ???? woof!
husky 是一个增强的 git hook 工具,可以在 git hook 的各个阶段执行我们在 package.json 中配置好的 npm script。
借助husky在每次 commit 时执行 commitlint来检查我们输入的 message。
(1)安装
注意:指定-g也不对所有Project生效!每个Project都需要重新安装husky
npm install husky -g
(2)配置
在 package.json 中配置 husky,commit-msg指定为commitlint (将在git hook的commit-msg阶段调用commitlint )
"devDependencies": {
...
},
"husky": {
"hooks": {
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
}
}
三、实践
1、VS Code
针对VS Code的Commit需要先配置global user.name和user.email(并不是都需要设置,有时为VS Code错误提示导致)
$ git config --global user.name "输入你的用户名"
$ git config --global user.email "输入你的邮箱"
-
不符合规范的提示
git commit -m 'test'
-
规范的Commit
git commit -m "feat: 新功能"
2、Git Bash
-
不符合规范的提示
git commit -m 'test'
-
规范的提示
git commit -m "fix: 修改test.cls"
四、注意
1、格式
?号对应可选项
type(scope?): subject
body?
footer?
2、Type约定
'feat', // 新功能
'upd', // 修改
'del', // 删除
'fix', // bug修复
'test', // 单元测试
'perf', // 性能优化
'docs', // 文档更新
'style', // 样式变动
'refactor', // 功能重构
'revert', // 回滚某个更早之前的提交
'package', // 创建包
3、Commit husky报错
husky > commit-msg hook failed (add --no-verify to bypass)
- 详细错误见下图:
-
解决方法
commitlint.config.js的编码修改为UTF-8
-
原因
Node.js doesn't understand that encoding by default(UTF-16 LE)
4、npm install 命令
注意-g -save-dev
NPM install -save 和 -save-dev 傻傻分不清
五、背后的原理
1、Git Hooks
某些Action如commit、merge发生时,可触发自定义脚本。触发动作可以在客户端或服务器端。
Like many other Version Control Systems, Git has a way to fire off custom scripts when certain important actions occur. There are two groups of these hooks: client-side and server-side. Client-side hooks are triggered by operations such as committing and merging, while server-side hooks run on network operations such as receiving pushed commits. You can use these hooks for all sorts of reasons.
https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks
2、commit.template
提交模板,对于Commit可以自定义一套提交后的提示内容及格式,可以结合Git Hooks
If you set this to the path of a file on your system, Git will use that file as the default initial message when you commit. The value in creating a custom commit template is that you can use it to remind yourself (or others) of the proper format and style when creating a commit message.
set the commit.template configuration value:
$ git config --global commit.template ~/.gitmessage.txt
$ git commit
https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration
六、参考
commitlint
config-conventional
https://www.npmjs.com/package/@commitlint/config-conventional
Husky
https://github.com/typicode/husky
你可能已经忽略的 git commit 规范
https://mp.weixin.qq.com/s/8oWsj_ipp73crD_vg58LeQ
git-commit-lint-vscode
https://github.com/UvDream/git-commit-lint-vscode