你也可以实现husky这样的githooks工具

本文讨论了gitcommit中的良好实践,介绍了githooks的概念,包括客户端和服务器端的不同类型。作者探讨了不使用husky等工具的情况下如何手动实现git操作检查,并对比了第三方库带来的效率提升。最后,文章详细介绍了husky的使用,以及如何解决hooks脚本追踪和一致性问题。
摘要由CSDN通过智能技术生成

在我们的日常工作中,git可以说是天天被打交道,好的commit信息会让工作效率事半功倍,尤其是团队遇到某些失败的操作,回滚是不可避免的事情,那么commit信息在这里也尤为重要了,所以有些团队给代码上了husky、lint-staged等一些githooks工具。

这个时候问题来了,如果要实现git操作的检查,是否一定要下载第三方库?

什么是githooks

也叫git钩子,其实就是一类在特定时机被执行的脚本。既然是可执行,也就无所谓语言了,shell脚本、js脚本等都可以被计算进去。

官方根据 操作是否可在没有网络时成功 对githooks又进行了细分,分为 客户端hooks、服务端hooks。

以下是 客户端hooks 的种类与描述:

钩子描述
pre-commit执行git commit 时被触发
pre-push执行git push 时被触发

以下是 服务端钩子 的种类与描述:

钩子描述
pre-receive远程仓库接收到推送时触发

有些小伙伴可能还听过 commit-msg 这个钩子,它与 pre-commit 的关系如下:

当我们执行以下命令:

git commit -m "测试githooks";

pre-commit 会比 commit-msg 更早的触发。

那么接下来,就该进入正题了,我们不用这些工具,是否可以实现git操作检查?

第三方的githooks工具是否一定要用?

答案是肯定的,一定要用第三方库。原因是效率更高,当然并不是所有的第三方库都可以去提升效率。

那接下来,我们就要看看,如果不用第三方库,我们应该如何实现git操作的校验,这样在这个过程中,我们才能知道第三方库到底能够提升多少效率。

假设我们不使用第三方库,我们要实现git commit信息的检查,首先我们肯定要先去官网上看看,git是否支持这样做。经过查找,我们发现githooks可以帮我们做到。

我们这里初始化一个名为 husky-prj的项目,依次执行以下命令:

mkdir husky-prj
git init
npm init -y

此时我们会在.git/hooks目录下看到git官方预制的githooks脚本。

在这里插入图片描述

此时我们去掉 pre-commit.samplecommit-msg.sample文件的后缀,并且向这两个文件分别新写入如下内容:

# pre-commit文件写入
echo "pre-commit钩子被触发";

# commit-msg文件写入
echo "commit-msg钩子被触发";

此时当我们再执行 git commit -m "测试githooks" 命令时,我们会发现这2个钩子函数生效了。这也是标准做法,官方预制了一些githooks脚本,想要他们生效的方式是去掉.sample后缀。

那这个时候问题也来了,当我们修改钩子函数的脚本时,我们会发现git并没有追踪.git目录的修改,也就是说,你的这些改动并不会被提交到远程仓库里,那你的团队就会出现不统一的现象(特别是对那些pr的人特别不友好)。为了解决这种不统一的问题,husky这样的第三方库给出了解决方案。

husky的使用

在下载husky前,我们先来看下.git目录下的config文件里的内容:

在这里插入图片描述

安装husky

npm install husky --save-dev

下载依赖成功后,记住一定要在项目的根目录下新建一个.husky目录。

新增script命令

修改package.json文件内容如下:

在这里插入图片描述

向.husky目录下新增钩子函数

执行下面的命令:

npx husky add .husky/pre-commit "npm test"

上面这句命令的意思是:向.husky目录下新增 pre-commit钩子,并且向这个脚本里写入 npm test。

我们修改下项目根目录下的index.js文件如下:

console.log('husky成功的执行了');

此时我们执行 git commit -m “测试husky是否成功” 这个命令时 ,我们会发现,husky失败了,因为程序并没有执行npm test命令。如果husky成功的话,根据官网提示,它应该会执行.husky目录下的pre-commit脚本才对。

经过阅读husky官网我们发现,husky失败的原因是因为我们并没有指定githooks的工作路径。那官网也给出了解决方案,请运行如下命令:

npx husky install

上面的命令运行成功后,当我们再次进行git commit操作的时候,我们发现husky运行成功了。

修改githooks的工作路径

大家肯定好奇为什么执行npx husky install这个命令后,husky生效了。根据官网与源码来看,这个命令主要是执行了git config core.hooksPath $[value]。

上面的这个git命令是git官方最新推出的一个方法,存在兼容性问题。用于为 Git 仓库配置钩子路径的,它可以使该仓库下所有的 Git 仓库钩子都指向同一路径。

默认情况下,Git 会在仓库的 .git/hooks 目录下查找钩子。如果想要指定钩子路径,可以使用 git config core.hooksPath 命令来进行配置。其中,core.hooksPath 参数指定的是 Git 钩子的路径,可以是任意路径。

配置成功后,.git目录下的config文件会新增一条hooksPath内容:

在这里插入图片描述

需要注意的是,core.hooksPath 参数生效的前提是该路径下存在相应的钩子脚本,否则 Git 仍会在 .git/hooks 目录下执行预设的钩子脚本。

新增prepare命令是干啥的?

了解npm的朋友肯定都知道,npm也预制了一些hooks钩子,通过在命令前面增加pre前缀、post后缀来实现前置操作、后置操作。但prepare是比较特殊的钩子函数。它的执行时机是在 npm install完成后自动触发。

所以配置这个命令后,团队里的人再pull代码,重新安装依赖以后,整个团队在git校验这块就达成了共识。所以husky这样的第三方库还是很方便的,因为它解决了.git目录下hooks钩子无法被跟踪的问题

最后

再来一张husky流程图吧:

在这里插入图片描述

好啦,本期的分享到这里就结束啦,如果上述过程中有讲解的不对的地方,欢迎各路大神指正,那么我们下期再见~~

本人最近建立了一个交流群,这个交流群不仅局限于前端,你想要探讨任何一项技术都可以,因为是刚刚建立,所以群里会比较清净,想要加入群聊的,欢迎添加我的微信:18845097791

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值