Git Commit Message校验踩坑指南

背景

在团队多人开发中,规范的commit message可以快速定位代码提交历史,回溯问题根源,方便组内多人协作,提高团队效率。

本篇文章主要包含以下两方面内容:

  1. commitizen/cz-cli工具安装和使用
  2. git commit -m 提交message校验

1. commitizen/cz-cli

commitizen/cz-cli可以替代git commit -m生成符合规范的commit message

  • 全局安装commitizen
$ npm install -g commitizen

cz-conventional-changelog 是一个commitizen的 adapter(适配器),一个符合 Angular 团队规范的 preset(按照我们指定的规范帮助我们生成 commit message)

在项目根目录中运行以下命令进行安装

$ commitizen init cz-conventional-changelog --save --save-exact

配置 package.json

 "config": {
    "commitizen": {
      "path": "./node_modules/cz-conventional-changelog"
    }
  }

commitizen还可以支持自定义adapter,具体参考:

伯艺:如何配置 Git Commit Message​zhuanlan.zhihu.com

至此就可以使用git cz替代git commit 进行代码提交,前提是有代码在暂存区等待commit

2. git commit -m 提交message校验

虽然git cz可以方便地进行git commit代码提交,但是不能过滤掉不规范的git commit -m 提交message,接下来讲解怎么进行message校验

  • 校验 commit
    • @commitlint/cli 【命令行工具】
    • @commitlint/config-conventional 【校验规则】符合 Angular团队规范(不同于代码规范),当然还有其它规范。
$ npm i @commitlint/config-conventional @commitlint/cli -D  

package.json 配置

"commitlint": { 
    "extends": [ 
      "@commitlint/config-conventional" 
    ] 
  } 

或者在项目根目录下创建配置文件: .commitlintrc.js

module.exports = { 
  extends: ['@commitlint/config-conventional'] 
} 
 
  • 安装Husky

由于 git 提供了hook机制,所以我们可以通过 git hook 在 pre-commit 进行 eslint,在 commit-msg 阶段进行 commit message lint。

$ npm i husky -D 

配置 package.json

"husky": { 
    "hooks": { 
      "commit-msg": "commitlint -e $HUSKY_GIT_PARAMS" 
    } 
} 

或者在项目根目录下创建配置文件:.huskyrc

{ 
  "hooks": { 
    "commit-msg": "commitlint -e $HUSKY_GIT_PARAMS" 
  } 
} 
 

package.json完整配置:

{
  "devDependencies": {
    "@commitlint/cli": "^12.1.4",
    "@commitlint/config-conventional": "^12.1.4",
    "cz-conventional-changelog": "^3.3.0",
    "husky": "^7.0.1"
  },
  "config": {
    "commitizen": {
      "path": "./node_modules/cz-conventional-changelog"
    }
  },
  "husky": {
    "hooks": {
      "commit-msg": "commitlint -e $HUSKY_GIT_PARAMS"
    }
  }
}
  • 踩坑指南

此处有个巨坑,安装Husky之后并没有像网上说的那样在项目根目录下生成.git/hooks文件夹,运行git commit -m之后报错Command "husky-run" not found。

这是因为对于新版本husky(>= 6.0.0)已经做了变更,之前设置的方式已经失效了,而我项目中安装的默认是最新版本7.0.1

husky为什么会放弃之前的配置方式呢?

根据官方的说法,之前husky的工作方式是为了能够让用户设置任何类型的git hooks都能正常工作,所以在安装的时候就创建了所有类型的git hooks。这样在git 工作的每个阶段都会调用husky所设置的脚本,在这个脚本中husky会检查用户是否配置该hook,如果有就运行用户配置的命令,如果没有就继续往下执行。

这样做的好处就是无论用户设置什么类型的git hook husky都能确保其正常运行。但是缺点也是显而易见的,即使用户没有设置任何git hook,husky也向git中添加了所有类型的git hook。

新版的husky工作原理

新版的husky使用了从git 2.9开始引入的一个新功能core.hooksPath。core.hooksPath可以让你指定git hooks所在的目录而不是使用默认的.git/hooks/。这样husky可以使用husky install将git hooks的目录指定为.husky/,然后使用husky add命令向.husky/中添加hook。通过这种方式我们就可以只添加我们需要的git hook,而且所有的脚本都保存在了一个地方(.husky/目录下)

因此对于新版本husky还需要执行以下命令,在项目根目录下生成.husky文件夹

$ npx husky install 

使用以下命令在.husky文件夹中创建commit-message hook校验执行脚本

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

当输入普通的commit message时

git commit -m "commit message rule check" 

则会报错


需要使用git cz或者改为以下合规message才可以提交

git commit -m "feat: commit message rule check"

参考文档:

niexia:如何配置 git 提交规范

伯艺:如何配置 Git Commit Message

偏僻摩纳哥:husky使用总结

Command "husky-run" not found. · Issue #854 · typicode/husky

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值