一文理清git hook、husky与commitlint

1,931 阅读3分钟

我们经常在阅读文档的时候,看到这些词汇hook、plugin、事件、生命周期等。其实它们的功能大体相同,就是在特定的动作事件发生时触发之前注册的自定义方法、脚本。git hook也不例外。

1、git客户端钩子

git hook分为客户端和服务端。客户端钩子由诸如提交合并这样的操作所调用,而服务器端钩子作用于诸如接收被推送的提交这样的联网操作。本文只讨论客户端钩子,一般存储在.git/hooks目录下,如图:

截屏2022-02-16 上午11.19.23.png

这些示例的名字都是以 .sample 结尾,如果你想启用它们,得先移除这个后缀。

分类钩子描述
提交工作流钩子pre-commitgit commit 前运行,可以检查代码风格是否一致、单元测试等
commit-msg接收一个参数,git commit 信息的文件路径(默认为.git/COMMIT_EDITMSG)
post-msggit commit之后运行,一般用于通知之类的事情,如:git log -1 HEAD
电子邮件工作流钩子post-applypatch
applypatch-msg
pre-applypatch
其他客户端钩子pre-rebase
pre-rebase
pre-rewrite
post-checkput
post-merge
pre-push
服务器端钩子pre-receive
update
post-receive

以上是针对官网描述的简单摘抄,点击此处查看更多关于git hook的用法。

2、husky

正如官网描述如下,husky是一个让我们使用git hook更加方便的工具。

截屏2022-02-16 下午1.14.32.png

2.1、低版本

husky使用方法如下:

#1、安装husky
npm install husky --save-dev

#2、在package.json中添加使用钩子

{
  "husky": {
    "hooks": {
      "pre-commit": "npm run test", // 在commit之前先执行npm run test命令
      "commit-msg": "commitlint -e $HUSKY_GIT_PARAMS" // 校验commit时msg是否符合我们要求的规范
    }
  }
}

以上就完成了在客户端添加git hook pre-commitcommit-msg

2.2、高版本(从v6.0起)

使用方法1:

#1、安装husky
npm install husky --save-dev

#2、Enable Git hooks
npx husky install

#3、为了在项目npm install之后,运行第二部,在package.json中添加如下内容
{ 
    "scripts": { 
        "prepare": "husky install" 
    } 
}

推荐使用方法:

# 安装husky、修改package.json配置、默认添加pre-commit hook
npx husky-init && npm install

添加其他git hook如下:

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

npx husky install 做了两件事:

1、在根目录新建.husky目录,用于存放git hook;

截屏2022-02-16 下午1.54.41.png

2、修改.git/config配置文件,core.hooksPath = .husky(指向husky新建的目录)

截屏2022-02-16 下午1.24.15.png

2.3、 husky为什么放弃之前的配置方式

中文可以参考这篇husky使用总结

3、comitlint

以下是官网对commitlint的描述,规范的commit msg可以帮助提升团队开发效率。

截屏2022-02-16 下午2.59.30.png

3.1、使用方法

#1、 安装
npm install @commitlint/cli @commitlint/config-conventional --save-dev

#2、 配置commitlint.config.js
echo "module.exports = {extends: ['@commitlint/config-conventional']}" > commitlint.config.js

@commitlint/config-conventional是一个常用的commit社区规范,更多关于commitlint.config.js配置看此处

3.2、commit conventions模版

当git commit信息不满足以下模版时,提交失败,并给出提示。

type(scope?): subject
body?
footer?

type用于表明我们这次提交的改动类型,范围如下:

type描述
build修改项目构建
ci修改项目构建
docs修改项目构建
feat新增功能
fixbug修复
perf性能优化
refactor重构
style逻辑
test新增测试用例
revert回滚到之前的提交
chore不属于以上类型的其他

scope:一个可选的修改范围。用于标识此次提交主要涉及到代码中哪个模块。

description:一句话描述此次提交的主要内容,做到言简意赅。

获取更详细的描述,点击此处

3.3、 test

从头到尾梳理一次

#1、 安装husky
npm install husky --save-dev

#2、 新建husky目录,修改git hooksPath

npx husky install

#3、配置package.json
{ 
    "scripts": { 
        "prepare": "husky install" 
    } 
}

#4、安装校验commit 信息的 commitlint以及常用的规范@commitlint/config-conventional
npm install @commitlint/cli @commitlint/config-conventional --save-dev

#5、添加git commit钩子
npx husky add .husky/commit-msg 'npx --no-install commitlint --edit "$1"'

截屏2022-02-16 下午3.57.14.png

4、总结

git hook机制让我们有机会在commit、push、rebase时触发自定义的脚本,而husky使这个过程工程化,更简易。commitlint则是像eslint一样,帮助校验commit信息。