携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情
编程规范分析
上一篇中我们使用 git cz 去代替 git commit 去进行提交,但是如果有的同学,忘记使用 git cz 进行提交,那么我们之前的配置不就全部白费了吗?那么我们有没有办法限制这种错误的发生呢?
其回答必然是肯定的
咱们先来分析一下我们的预期效果
我们希望
当通过 git 进行提交时,如果提交的内容不符合约定的提交规范时,git 会阻止当前提交,并抛出错误
为了实现这个目的,我们就需要引入一个概念,他就是 Git hooks(git 钩子 || git 回调)
也就是在 git 执行某个操作之前或之后进行一些其他的操作(就像是 Vue 的路由守卫)
Git hooks 的详细介绍,可以点击这里查看
而在这里我们具体用到的钩子其实只有两个
| Git Hook | 调用时机 | 说明 |
|---|---|---|
| pre-commit | git commit 执行前它不接受任何参数,并且在获取提交日志消息并进行提交之前被调用。脚本 git commit 以非零状态退出会导致命令在创建提交之前中止。 | 可以用 git commit --no-verify 绕过 |
| commit-msg | git commit 执行前可用于将消息规范化为某种项目标准格式。还可用于在检查消息文件后拒绝提交。 | 可以用 git commit --no-verify 绕过 |
用白话来说:
1、commit-msg : 可以用来规范化标准格式,并且可以根据指定的内容决定要不要拒绝本次提交
2、pre-commit : 会在提交之前被调用,并且可以根据指定的内容决定要不要拒绝本次提交
下面我们要做的事就是使用这两个钩子配合 commitlint 进行提交信息的校验
先说明一下要用到的两个工具
1、commitlint:用于检查提交信息
2、 husky: 就是 git hooks 工具
注意:npm 需要在 7.x 以上
现在我们就来安装一下这两个工具
commitlint
1、安装依赖
npm install --save-dev @commitlint/config-conventional @commitlint/cli
2、创建 commitlint.config.js 文件
echo "module.exports = {extends: ['@commitlint/config-conventional']}" > commitlint.config.js
3、打开 commitlint.config.js,增加配置项(具体配置点此查看)
module.exports = {
// 继承的规则
extends: ['@commitlint/config-conventional'],
// 定义规则类型
rules: {
// type 类型定义,表示 git 提交的 type 必须在以下类型范围内
'type-enum': [
2,
'always',
[
'feat', // 新功能 feature
'fix', // 修复 bug
'docs', // 文档注释
'style', // 代码格式(不影响代码运行的变动)
'refactor', // 重构(既不增加新功能,也不是修复bug)
'perf', // 性能优化
'test', // 增加测试
'chore', // 构建过程或辅助工具的变动
'revert', // 回退
'build' // 打包
]
],
// subject 大小写不做校验
'subject-case': [0]
}
}
注意:确保保存为
UTF-8的编码格式,否则可能报错
husky
1、安装依赖
npm install husky --save-dev
2、启动 husky,生成 .husky 文件夹
npx husky install
3、在 package.json 中生成 prepare 指令( 需要 npm > 7.0 版本 )
npm set-script prepare "husky install"
4、执行 prepare 指令
npm run prepare
5、执行成功,提示
husky - Git hooks installed
6、添加 commitlint 的 hook 到 husky中,并在 commit-msg 的 hooks 下执行以下指令
npx husky add .husky/commit-msg 'npx --no-install commitlint --edit "$1"'
7、此时,.husky 的文件结构
至此,不符合规定的提交信息将不会被提交