Git Hooks
# 前言
具备基本工程素养的同学都会注重编码规范,而代码风格检查(Code Linting,简称 Lint)是保障代码规范一致性的重要手段。
使用 Lint
会有什么好处呢?在我看来至少具有如下 3 点:
- 更少的 Bug
- 更高的开发效率,Lint 很容易发现低级的、显而易见的错误
- 更高的可读性
很多时候我们lint
的校验是放在持续集成阶段,大概流程如下:
代码提交 --> 跑 CI 发现问题(远程) --> 本地修复问题 --> 重新提交 --> 通过检查(远程)
但这样有一个问题,我们的 CI
(持续集成) 往往不是仅仅只做 Lint
工作,它还有会有很多其它的任务(如打包文件,静态资源上传 CDN 等),这样就导致特别的浪费时间,往往可能需要几分钟之后你才会发现问题,或者有的时候你根本就没有发现你的 CI
没有跑通过。
常见的流程:本地写好了代码,提交,开始跑 lint,发现不通过,本地修改代码,再提交,再等待 CI 的结果,若还有问题再重复之前的操作。
https://panjiachen.github.io/vue-element-admin-site/zh/guide/advanced/git-hook.html#husky
# 目的
当《提交描述信息》不符合 约定式提交规范 的时候,阻止当前的提交,并抛出对应的错误提示
# 提交前出发检查
# git hooks 的hooks
hooks | 调用时机 | 作用 | 说明 |
---|---|---|---|
pre-commit | git dommit 执行前 它不接受任何参数,并且在获取提交日志消息并进行提交之前被调用。 脚本 git commit 以非零状态退出会导致命令在创建提交之前中止。 | 会在提交前被调用,并且可以按需指定是否要拒绝本次提交 | 可以用 git commit --no-verify 绕过 |
commit-msg | git commit 执行前<br /: 可用于将消息规范化为某种项目标准格式。 <br 还可用于在检查消息文件后拒绝提交。 | 可以用来规范化标准格式,并且可以按需指定是否要拒绝本次提交 | 可以用git commit --no-verify 绕过 |
# 检查提交描述是否符合规范要求
需要使用到两个工具
- commitlint: 检查提交信息。
- husky:是git hook 工具
# commitlint
github https://github.com/conventional-changelog/commitlint
- 检查您的提交消息是否符合传统的提交格式。
- 提交格式: type(scope?): subject 在我的另一片文章git 提交规范中提到
- 正确示例:fix(server): send cors headers
# 安装
npm install --save-dev @commitlint/config-conventional@16.2.1 @commitlint/cli@16.2.1
# 配置
创建 commitlint.config.js,并键入以下内容:
module.exports = { extends: ['@commitlint/config-conventional'], // 集成规则 // 定义规则 会覆盖集成规则 roles: { // type 的类型定义:表示 git 提交的 type 必须在以下类型范围之内 'type-enum': [ //当前验证的错误级别 2, //在什么情况下进行验证 'always', // 泛型内容 ['feat', 'fix', 'docs', 'style', 'refactor', 'perf', 'test', 'chore', 'revert', 'WIP'] ], // 大小写不做校验 'subject-case': [0] } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17- 更多配置项查看官方文档 https://commitlint.js.org/#/reference-configuration
# husky (哈撒给)
# 安装
npm install husky@7.0.4 --save-dev
# 启用
npx husky install
# 配置
// package.json
{
"scripts": {
"prepare": "husky install"
}
}
2
3
4
5
6
npm7+ 可以使用npm set-script prepare "husky install"
直接在package.json中生成脚本命令
# 添加指令
添加上面的commitlint指令在husky中
npx husky add .husky/commit-msg 'npx --no-install commitlint --edit "$1"'
.husky 的文件结构
# 检验
git add .
git commit -m 'test hooks'
会得到提示
> git -c user.useConfigOnly=true commit --quiet --allow-empty-message --file -
⧗ input: test git hooks
✖ subject may not be empty [subject-empty]
✖ type may not be empty [type-empty]
✖ found 2 problems, 0 warnings
ⓘ Get help: https://github.com/conventional-changelog/commitlint/#what-is-commitlint
husky - commit-msg hook exited with code 1 (error)
2
3
4
5
6
7
8
9