Git 规范
Git 作为现在最流行的分布式管理工具,基本上是每个团队的必备。
Git Commit格式校验
- 准备commitlint/cli用于格式校验
- 准备husky用于git提交代码时触发校验
husky
husky 是创建 git 客户端 hooks 的神器。
目前最新版本是 7.*
,文档在这里(opens new window)
初始化 husky 只需要三步。首先要安装:
$ npm i husky --save-dev
复制代码
执行下面的脚本,会初始化一个 .husky
目录:
$ npx husky install
复制代码
初始化后,就可以添加 hook 了。
添加一个 commit-msg
钩子,并指定一个默认 shell:
$ npx husky add .husky/commit-msg 'npx --no-install commitlint --edit "$1"'
复制代码
现在在执行 git commit
之前,就会执行上面指定的 shell。
commitlint
上面的 shell 里有一个 commitlint
命令,其实它是另一个工具,用来校验 commit 提交信息,这是 husky + commitlint
这对黄金搭档的主要功能。
commitlint 的文档在这里(opens new window)
为了直观的看出 commit 的更新内容,开发者社区诞生了一种规范,将 commit 按照功能划分,加一些固定前缀,比如 fix:
,feat:
,用来标记这个 commit 主要做了什么事情。
commitlint
命令就是校验 commit 信息是否符合上述规范,不符合,则会配合 husky 阻止提交。
首先安装 commitlint:
$ npm i @commitlint/{config-conventional,cli} --save-dev
复制代码
然后创建配置文件:
echo "module.exports = {extends: ['@commitlint/config-conventional']}" > commitlint.config.js
复制代码
这样就好了,然后我们随便改一处代码,试试效果:
$ git add .
$ git commit -m 'test'
复制代码
因为 “test” 不符合 commit 规范,所以被阻止了,执行结果如下:
我们再试一下符合规范的提交格式:
$ git commit -m 'fix: 修复**功能'
复制代码
这样就可以通过了!
commit前缀
目前主流的前缀包括以下部分:
- build:表示构建,发布版本可用这个
- ci:更新 CI/CD 等自动化配置
- chore:杂项,其他更改
- docs:更新文档
- feat:常用,表示新增功能
- fix:常用:表示修复 bug
- perf:性能优化
- refactor:重构
- revert:代码回滚
- style:样式更改
- test:单元测试更改
当你的项目中出现如上图的commit log,你会有什么感受?乱(强迫症看着是真难受)
格式不统一,type、scope没有合理使用,空格使用不规范等等,让我们无法在短暂的时间内从commit log中看到有用的信息。
这时,我们在团队内,提出一个commit message规范issue-id type(scope): 描述内容
,让大家提交时遵守这个规范。
但是我们仅仅通过人为去遵守,总是不可靠,可能多一个空格少一个空格,也看不出来。
互联网时代,就交给代码去做吧!
清晰易懂、格式统一之后的commit log,请看下图:
此文就给大家介绍一个npm包husky-hook
,告别繁琐的安装和脚本开发等,只需安装即可开启校验。
husky-hook
github地址:github.com/anyblue/hus…
npm地址:www.npmjs.com/package/hus…
husky + .git/hooks/commit-msg的结合
介绍
- 基于husky(版本7.x)
- 增加校验
commit message
的脚本 git commit
时运行.husky/commit-msg
钩子- 校验成功之后,执行
.git/hooks
目录下的默认commit-msg
钩子
安装
以NPM安装为例:
安装
npm install husky-hook --save-dev
复制代码
开启校验
命令行运行下述命令,生成.husky目录和校验脚本:
npx husky-hook install
复制代码
install
后自动开启校验,请执行下方命令:
npm set-script prepare "husky-hook install"
复制代码
操作完成后,你将会在项目根目录看到如下目录和文件:
使用
安装成功后,我们就可以通过git commit -m 'xxx'
提交代码了。
校验不通过
将会出现如下提示:
校验通过
如果你不需要运行.git/hooks/commit-msg
钩子,出现如下提示:
则修改.husky/commit-msg
中的exit 1
为exit 0
重新git commit -m 'xxx'
,即可通过校验,commit成功。
卸载
不需要时,可以按照下述命令操作,进行卸载:
npx husky-hook uninstall
npm uninstall husky-hook
复制代码
遇到的问题
- 如何在使用
husky
的同时,使用.git/hooks
默认钩子
husky
生成的钩子存储在.husky
目录下,并且更改了.git/config
的hooksPath = .husky
,也就是说,使用了husky
来处理gitHooks
,那就只能执行.husky
目录下的钩子脚本,执行不了.git/hooks
下的脚本。
在.husky/commit-msg
中手动去执行.git/hooks
中的脚本,如下:
......
if [ -e .git/hooks/commit-msg ]; then
. .git/hooks/commit-msg
else
# Install custom hooks, such as using Gerrit to generate change ID
echo '\033[31m Please check and install .git/hooks/commit-msg hooks \033[0m'
exit 0
fi
复制代码
- husky 5.x 以上版本与gerrit生成评审id(.git/hooks/commit-msg用gerrit来生成评审id)冲突
冲突在于获取get config get gerrit.reviewUrl
时,没有设置的话,出现异常退出了。
可以通过以下脚本设置gerrit.reviewUrl
为空,前提是这个值本身应该为''
git config --local gerrit.reviewUrl ''
复制代码
结语
简洁清晰易懂的commit message对于项目开发来说,至关重要。
快快用起来吧!看谁还敢不好好写commit message