赞
踩
在团队多人开发中,规范的commit message可以快速定位代码提交历史,回溯问题根源,方便组内多人协作,提高团队效率。
本篇文章主要包含以下两方面内容:
commitizen/cz-cli可以替代git commit -m生成符合规范的commit message
$ 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 Messagezhuanlan.zhihu.com
至此就可以使用git cz替代git commit 进行代码提交,前提是有代码在暂存区等待commit
虽然git cz可以方便地进行git commit代码提交,但是不能过滤掉不规范的git commit -m 提交message,接下来讲解怎么进行message校验
$ npm i @commitlint/config-conventional @commitlint/cli -D
package.json 配置
- "commitlint": {
- "extends": [
- "@commitlint/config-conventional"
- ]
- }
或者在项目根目录下创建配置文件: .commitlintrc.js
- module.exports = {
- extends: ['@commitlint/config-conventional']
- }
由于 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"
参考文档:
Command "husky-run" not found. · Issue #854 · typicode/husky
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。