使用husky规范commit msg

git commit提交规范

通常使用 Google AngularJS 规范的要求。 格式要求:

<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>

<type>代表某次提交的类型,比如是修复一个 bug 或是增加一个 feature,具体类型如下:

类型 描述
feat 新增feature
fix 修复bug
docs 仅仅修改了文档,比如README, CHANGELOG, CONTRIBUTE等等;
style 仅仅修改了空格、格式缩进、逗号等等,不改变代码逻辑;
refactor 代码重构,没有加新功能或者修复bug
perf 优化相关,比如提升性能、体验
test 测试用例,包括单元测试、集成测试等
chore 改变构建流程、或者增加依赖库、工具等
revert 回滚到上一个版本

git hook执行时机说明

git hook 执行时机 说明
applypatch-msg git am 执行前 默认情况下,如果commit-msg启用的话,applpatch-msg钩子在启用时会运行commit-msg钩子
pre-applypatc git am 执行前 默认的pre-applypatch钩子在启用时运行pre-commit钩子(如果后者已启用)
post-applypatch git am 执行后 这个钩子主要用于通知,不能影响git-am的结果
pre-commit git commit 执行前 可以使用 git commit --no verify 命令绕过该钩子
pre-merge-commit git merge 执行前 可以使用 git merge --no verify 命令绕过该钩子
prepare-commit-msg git commit执行之后,编辑器打开之前
commit-msg git commit 执行前 可以使用 git commit --no verify 命令绕过该钩子
post-commit git commit 执行后 不影响git commit的结果
pre-rebase git rebase执行前
post-checkout git checkout 或 git switch执行后 如果不使用 --no-checkout 参数,则在 git clone 之后也会执行
post-merge git merge 执行后 在执行git pull 时也会被调用
pre-push git push 执行前
pre-receive git receive pack 执行前
update
proc-receive
post-receive git receive pack 执行前 不影响 git receive pack 的执行结果
post-update 当git receive pack对 git push 作出反应并更新仓库中的引用时
reference-transaction
push-to-checkout 当git receive pack对 git push 作出反应并更新仓库中的引用时,以及当推送试图更新当前被签出的分支且 receive.denyCurrentBranch配置被updateInstead时
pre-auto-gc git gc --auto 执行前
post-rewrite 执行 git commit --amend 或 git rebase 时
sendemail-validate git send-email 执行前
fsmonitor-watchman 配置core.fsmonitor被设置为.git/hooks/fsmonitor-watchman 或.git/hooks/fsmonitor-watchmanv2时
p4-changelist git-p4 submit 执行并编辑完changelist message 之后 可以使用 git-p4 submit --no-verify绕过该钩子
p4-prepare-changelist git-p4 submit 执行后,编辑器启动前 可以使用 git-p4 submit --no-verify绕过该钩子
p4-post-changelist git-p4 submit 执行后
p4-pre-submit git-p4 submit 执行前 可以使用 git-p4 submit --no-verify绕过该钩子
post-index-change 索引被写入 read-cache.c do_write_locked_index后

步骤

安装依赖

  1. 安装husky
yarn add husky -D
  1. 安装@commitlint/cli @commitlint/config-conventional lint-staged
yarn add @commitlint/cli @commitlint/config-conventional lint-staged -D

配置

  1. 根目录下新建commitlint.config.js
module.exports = {
  extends: [
    "@commitlint/config-conventional"
  ],
  // 以下是我们自定义的规则
  rules: {
    'type-enum': [
      2,
      'always',
      [
        'bug', // 此项特别针对bug号,用于向测试反馈bug列表的bug修改情况
        'feat', // 新功能(feature)
        'fix', // 修补bug
        'docs', // 文档(documentation)
        'style', // 格式(不影响代码运行的变动)
        'refactor', // 重构(即不是新增功能,也不是修改bug的代码变动)
        'test', // 测试
        'chore', // 构建过程或辅助工具的变动
        'revert', // feat(pencil): add ‘graphiteWidth’ option (撤销之前的commit)
        'merge' // 合并分支, 例如: merge(前端页面): feature-xxxx修改线程地址
      ]
    ]
  }
};
  1. package.json添加scripts
...,
"scripts": {
"prepare": "husky install",
"husky-msg-init": "husky add .husky/pre-commit \"npx lint-staged --allow-empty \"$1\"\"&yarn husky add .husky/commit-msg \"npx commitlint --edit \"$1\"\""
},
...
  1. package.json添加lint-staged
{
  ...,
  "lint-staged": {
    "src/**/*.{js,jsx,ts,tsx,json}": [
      "prettier --write",
      "eslint",
      "git add"
    ]
  },
  ...
}

prettiereslint如果项目不需要可以去掉

运行命令

yarn prepare

运行后会在项目根目录生成.husky文件夹,包含.gitignorehusky.sh两个文件

yarn husky-msg-init

运行后会在.husky目录下生成commit-msg pre-commit两个文件

commit-msg文件:

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

npx commitlint --edit $1

pre-commit文件:

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

npx lint-staged --allow-empty $1

这样commit提交规范就完成了,如果commit msg不符合规范则无法提交

当前所使用环境版本

环境 版本
node v16.14.2
npm 6.14.10
yarn 1.22.18
husky ^7.0.4
@commitlint/cli ^16.2.3
@commitlint/config-conventional ^16.2.1
lint-staged ^12.3.7

参考

husky(https://typicode.github.io/husky/)
掘金(https://juejin.cn/post/6982192362583752741)

评论

0 / 800
全部评论()