使用 Husky + Commitlint + Lint-staged 约束每一次 Git 提交

使用 Husky + Commitlint + Lint-staged 约束每一次 Git 提交


当一个项目有多个参与者,此时保持统一的风格和规范有利于项目的维护

常见工具说明

  • Eslint ESLint静态分析您的代码以快速查找并修复JavaScript代码中的问题
  • prettier 代码格式化工具,更好的代码风格效果
  • husky Git hooks 工具, 可以在执行 git 命令时,执行自定义的脚本程序
  • lint-staged 对暂存区 (git add) 文件执行脚本
  • commitlint 检测 git commit 内容是否符合定义的规范

eslintprettier这个2个工具不会直接约束git提交,这里就不在过多描述了

一、Husky

Husky 是一款 Git Hooks 工具,可以在执行特定的 git 命令时(如: git commit, git push)触发对应的脚本,您可以使用它来检查提交消息、运行测试、检查代码等。

::: tip 提示 Git Hooks 简单来说就是git执行某些操作时而触发定义的动作(钩子) :::

安装

具体安装请查看官网安装指导

shell 复制代码
npx husky-init && npm install
shell 复制代码
pnpm dlx husky-init && pnpm install
shell 复制代码
yarn dlx husky-init --yarn2 && yarn

安装完成后,你会发现发生以下变化:

  1. 项目根目录出现 .husky文件夹
  2. .husky文件夹里面有一个名为pre-commit脚本文件
shell 复制代码
# .husky/pre-commit

#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

npm test

pre-commit 见名知义,就是在 commit 执行前的脚本文件。 pre-commit 文件中默认配置 npm test,此时执行git commit操作会自动执行npm test。

3.package.json增加了一个 prepare脚本

json{4} 复制代码
// package.json
{
  "scripts": {
    "prepare": "husky install"
  }
}

prepare脚本会在每次npm install(不带参数)之后自动执行。 也就是说当我们执行npm install安装完项目依赖后会执行 husky install命令,该命令会创建.husky/目录并指定该目录为git hooks所在的目录。

创建新的钩子

shell 复制代码
npx husky add .husky/pre-commit "npm test"

提示

如果面临特殊情况,需要绕过 Git Hooks,可以使用 --no-verify

shell 复制代码
git commit -m "commit_message" --no-verify

二、lint-staged

在提交的代码的时候,可以通过 ESLint、Prettier 等工具来格式化代码

但如果直接处理全部代码,首先是可能存在性能问题,其次是可能会修改掉别的同事的代码

这时可以引入 lint-staged,它可以过滤出 Git 代码暂存区文件,这样就不会影响到未更改的文件

安装和设置

安装 lint-staged ::: code-group

shell 复制代码
npm add -D lint-staged
shell 复制代码
pnpm add -D lint-staged
shell 复制代码
yarn add -D lint-staged

package.json 配置lint-staged所需要的规则

json 复制代码
{
  "lint-staged": {
    "*.{js,ts}": [
      "eslint --fix",
      "prettier --write"
    ],
    "*.{cjs,json}": [
      "prettier --write"
    ],
    "*.{vue,html}": [
      "eslint --fix",
      "prettier --write",
      "stylelint --fix"
    ],
    "*.{scss,css}": [
      "stylelint --fix",
      "prettier --write"
    ],
    "*.md": [
      "prettier --write"
    ]
  }
}

设置pre-commitgit hook 来运行lint-staged

shell 复制代码
npx husky add .husky/pre-commit 'npx lint-staged'

然后 .husky文件夹里出现名为pre-commit脚本文件

shell 复制代码
# .husky/pre-commit

#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

npx lint-staged

三、Commitlint

Commitlint 可以校验 git commit message, 只有规范的 commit message 才能提交,

简单来说,就是当我们运行git commmit -m 'xxx'时,来检查'xxx'是不是满足团队约定好的提交规范的工具。

安装

  • @commitlint/cli 是脚手架工具
  • @commitlint/config-conventional 是官方推荐可继承的配置文件
shell 复制代码
npm install -g @commitlint/cli @commitlint/config-conventional

这里是默认安装全局,当然你也可以安装在项目里

shell 复制代码
npm add -D @commitlint/cli @commitlint/config-conventional
shell 复制代码
pnpm add -D @commitlint/cli @commitlint/config-conventional
shell 复制代码
yarn add -D @commitlint/cli @commitlint/config-conventional

项目根目录新建一个 commitlint.config.js 文件

shell 复制代码
echo "module.exports = {extends: ['@commitlint/config-conventional']}" > commitlint.config.js

commitlint.config.js 文件配置继承 @commitlint/config-conventional,当然你也是可以自定义规则

js 复制代码
// commitlint.config.js
module.exports = {
    // 继承的规则
    extends: ["@commitlint/config-conventional"],
    // 自定义规则
    rules: {
        // @see https://commitlint.js.org/#/reference-rules

        // 提交类型枚举,git提交type必须是以下类型
        "type-enum": [
            2,
            "always",
            [
                "feat", // 新增功能
                "fix", // 修复缺陷
                "docs", // 文档变更
                "style", // 代码格式(不影响功能,例如空格、分号等格式修正)
                "refactor", // 代码重构(不包括 bug 修复、功能新增)
                "perf", // 性能优化
                "test", // 添加疏漏测试或已有测试改动
                "build", // 构建流程、外部依赖变更(如升级 npm 包、修改 webpack 配置等)
                "ci", // 修改 CI 配置、脚本
                "revert", // 回滚 commit
                "chore", // 对构建过程或辅助工具和库的更改(不影响源文件、测试用例)
            ],
        ],
        "subject-case": [0], // subject大小写不做校验
    },
}

新增 Husky hook

添加 commit-msg 脚本,这样在每次 git commit 的时候执行 commitlint 校验

shell 复制代码
npx husky add .husky/commit-msg  'npx --no -- commitlint --edit ${1}'

脚本文件内容如下

shell 复制代码
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

npx --no-install commitlint --edit $1

完成以上配置之后,只有满足规范的 commit message 才能提交

参考

相关推荐
凹凸曼打不赢小怪兽20 分钟前
react 受控组件和非受控组件
前端·javascript·react.js
狂奔solar31 分钟前
分享个好玩的,在k8s上部署web版macos
前端·macos·kubernetes
qiyi.sky33 分钟前
JavaWeb——Web入门(8/9)- Tomcat:基本使用(下载与安装、目录结构介绍、启动与关闭、可能出现的问题及解决方案、总结)
java·前端·笔记·学习·tomcat
清云随笔1 小时前
axios 实现 无感刷新方案
前端
鑫宝Code1 小时前
【React】状态管理之Redux
前端·react.js·前端框架
忠实米线1 小时前
使用pdf-lib.js实现pdf添加自定义水印功能
前端·javascript·pdf
pink大呲花1 小时前
关于番外篇-CSS3新增特性
前端·css·css3
少年维持着烦恼.1 小时前
第八章习题
前端·css·html
我是哈哈hh1 小时前
HTML5和CSS3的进阶_HTML5和CSS3的新增特性
开发语言·前端·css·html·css3·html5·web
田本初2 小时前
如何修改npm包
前端·npm·node.js