Skip to content

Git Hooks

仲灏2022-02-24约 1 分钟

<div style="display: none;" hidden="true" aria-hidden="true" data-nosnippet>Are you an LLM? You can read better optimized documentation at /pages/486e07.md for this page in Markdown format</div>

前言

具备基本工程素养的同学都会注重编码规范,而代码风格检查(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-commitgit dommit 执行前<br /><br/>它不接受任何参数,并且在获取提交日志消息并进行提交之前被调用。<br/>脚本 git commit 以非零状态退出会导致命令在创建提交之前中止。会在提交前被调用,并且可以按需指定是否要拒绝本次提交可以用 git commit<br/>--no-verify 绕过
commit-msggit commit 执行前<br /:<br/>可用于将消息规范化为某种项目标准格式。 <br<br/>还可用于在检查消息文件后拒绝提交。可以用来规范化标准格式,并且可以按需指定是否要拒绝本次提交可以用git commit<br/>--no-verify 绕过

检查提交描述是否符合规范要求

需要使用到两个工具

  • commitlint: 检查提交信息。
  • husky:是git hook 工具

commitlint

github https://github.com/conventional-changelog/commitlint

  • 检查您的提交消息是否符合传统的提交格式。
    • 提交格式: type(scope?): subject 在我的另一片文章git 提交规范中提到
    • 正确示例:fix(server): send cors headers

安装

shell
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]
      }
    }

husky (哈撒给)

安装

npm install husky@7.0.4 --save-dev

启用

npx husky install

配置

// package.json
{
  "scripts": {
    "prepare": "husky install"
  }
}

npm7+ 可以使用npm set-script prepare "husky install" 直接在package.json中生成脚本命令

添加指令

添加上面的commitlint指令在husky中

shell
npx husky add .husky/commit-msg 'npx --no-install commitlint --edit "$1"'

.husky 的文件结构

image-20220225161525702

检验

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)