我们经常在阅读文档的时候,看到这些词汇hook、plugin、事件、生命周期等。其实它们的功能大体相同,就是在特定的动作事件发生时触发之前注册的自定义方法、脚本。git hook也不例外。
1、git客户端钩子
git hook分为客户端和服务端。客户端钩子由诸如提交和合并这样的操作所调用,而服务器端钩子作用于诸如接收被推送的提交这样的联网操作。本文只讨论客户端钩子,一般存储在.git/hooks目录下,如图:
这些示例的名字都是以 .sample 结尾,如果你想启用它们,得先移除这个后缀。
| 分类 | 钩子 | 描述 |
|---|---|---|
| 提交工作流钩子 | pre-commit | git commit 前运行,可以检查代码风格是否一致、单元测试等 |
| commit-msg | 接收一个参数,git commit 信息的文件路径(默认为.git/COMMIT_EDITMSG) | |
| post-msg | git 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更加方便的工具。
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-commit 和 commit-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;
2、修改.git/config配置文件,core.hooksPath = .husky(指向husky新建的目录)
2.3、 husky为什么放弃之前的配置方式
中文可以参考这篇husky使用总结
3、comitlint
以下是官网对commitlint的描述,规范的commit msg可以帮助提升团队开发效率。
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 | 新增功能 |
| fix | bug修复 |
| 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"'
4、总结
git hook机制让我们有机会在commit、push、rebase时触发自定义的脚本,而husky使这个过程工程化,更简易。commitlint则是像eslint一样,帮助校验commit信息。