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