【工具】Git Hook

2020-06-28 16:29:50 浏览数 (1)

失踪人口终于回来了

因为换了一个公司,发现在这里有太多东西学了,而且技术大牛特别多,仿佛从原始时代进入了工业时代,所以一直在埋头学习,就好久没有更新文章了。

后面打算把这里学到的所有东西都写成文章,变成自己的哈哈哈

但是还是先把之前的知识给总结完,温故而知新,我写的文章,自己忘了都会拿出来看的,果然没有白费我花这么精力去写

废话不多说,继续总结

作为一个合格的前端,项目中的自动化检查和自动化测试是必须要学会的

之前这个东西我是蛮抵触的,虽然有接触过,但是总觉得这个东西很麻烦和 难

所以也就草草学会用一下,当然,现在也早已经忘光了但是这样不行的啊,所以我才立志把这些东西逐一突破,并且运用在项目中,并且现在大公司每个项目都必须使用到这个的,所以不熟悉是不行的

今天我打算分几个问题去彻底了解 Git Hook

1、什么是 git hook?

2、有什么用?

3、怎么简单用?

4、怎么配合项目使用?

5、怎么使用更加方便?

Git Hook是什么

git hook 是在 git 发生某些操作时会触发的脚本

脚本在哪里?

当你使用 git init 初始化时,就会生成

你可以在钩子的文件夹中有很多文件,没错,这些就是钩子触发的脚本

有什么钩子

钩子分为两种,客户端钩子 和 服务端钩子

客户端钩子,会在本地提交和合并的使用调用,比如 上面出现的脚本文件,

代码语言:javascript复制
pre-commit.sample 在 commit 时被调用pre-push.sample 在 push 时被调用

服务端钩子,则是在接收被推送的提交这样的联网操作时被调用,比如 pre-receive.sample 在 接收推送时被调用

你可能在想,为什么要分两种钩子?看完下面 git hook 作用再揭晓

这些文件都是什么?

打开这些文件,发现他们就是 shell 脚本

代码语言:javascript复制
我们通过 shell 命令来操作和控制操作系统shell 命令包含有 ls,cd 等。总的来说,shell 就是一个命令解释器接收用户输入的 shell 命令来执行相应的操作。而如果我们想一次性执行大量 shell 命令 然后把 这些命令集中放到一个文件中那么这个文件就叫做 shell 脚本

这些脚本你可以使用 Python 去编写他们

你可以看到,这些文件都是以 .sample 结尾的,如果你想 git 在 发生特定操作时会调用这些脚本,你需要把 .sample 这个后缀给去掉

git hook 有什么用?

当我们知道,git hook 会在特定操作发生时调用某些脚本之后,所以我们就可以在脚本上面做文章了比如我们会弄一个脚本,在提交之前,把我们项目中的代码给 检查一遍,看他们是否规范,如果不规范就报错,不让你提交

或者 提交之前 跑一遍测试,保证代码的健壮性,不通过测试也不让提交。

在团队的项目合作中,这是非常有必要的,因为大家的水平参差不齐,为了在保证项目质量的情况下,这一步是必须的。

强制规范你的代码,不然让你轻易提交一堆又有 bug 又乱七八糟的代码,这 TM 无疑是 自杀

但是,有一种方法,可以跳过本次的检查,也就是跳过本地钩子的触发!

那就是

代码语言:javascript复制
git commit --no-verify

卧槽,这特么就让你这么容易轻松逃过了??

所以!我们才有了服务端钩子!!就算你逃得过本地检查,也逃不过远程仓库的检查,哈哈哈

但是记得这个跳过也是非常有必要的啊,因为并不是所有提交都必须要检查的,所以需要记住这个东西

Git Hook 怎么用

既然 git hook 是调用的脚本,当然我们就要写脚本啦(不用怕,不是真的写复杂的脚本)

来跟着一步步使用

1、新建一个项目,并且 git init

2、进入项目的文件夹 .git/hooks/

3、我们来测试调用一下 commit 时的脚本,所以我们找到 pre-commit.sample 这个文件,并且把 .sample 去掉(前面已经说过了,如果不去掉,这个脚本是不会被触发的)

4、然后写个简单脚本,如下

代码语言:javascript复制
#!/bin/shecho "commit 脚本被执行"

我们并没有写什么复杂的脚本,就是简单打印一下信息,表示这个脚本被执行了,让我们清楚一下整个调用的流程

然后保存~~~

5、新增一个文件 a.js,然后执行下面的命令

代码语言:javascript复制
git add .git commit -m "test"

然后发生钩子被成功调用了,因为我们在脚本中的内容被打印出来了

现在你知道 git 是怎么调用 hook 的了吧,就是执行里面的脚本

当然如果我们用在项目中,肯定是比这更加复杂的脚本啦

怎么配置项目使用

当然了,我们在项目中是不可能自己写一个脚本去检查我们的代码的(咦,造轮子)

已经有现成的轮子帮我们做好了这个事情

不过,如果你想自己写个轮子去试验一下也是不错的呢

好的,这个包就是 husky,现在我们就来尝试一下使用这个包,并配合 eslint 去检查我们的项目

1、新建一个项目如下,结构如下

src 就是我们的开发目录,我们以后就是提交里面的 index.js 文件

确保这个项目已经 git init 过,有本次仓库哦

2、现在来安装依赖

代码语言:javascript复制
npm i husky eslint -D

然后初始化 eslint,这个不是今天的重点

代码语言:javascript复制
npx eslint --init

npx 作用是,调用项目内部安装的模块,因为以前如果某些模块没有全局安装的话,要在命令行调用,只能通过 npm 的 script 去间接调用

现在可以通过 npx 去调用项目中的模块啦

初始化之后就会给我们添加了一个 eslint 的配置文件

3、添加脚本命令

进入 package.json

代码语言:javascript复制
{        "scripts": {        、        "precommit":"eslint ./src/*.js"    },
}

上面添加的 precommit 就是 git 的 钩子

前面我们提到过的 git 的脚本,husky 已经在 .git/hooks 下重新添加了自己写的脚本

.sample 结尾的就是 原生的 git hook 脚本,没有结尾的,就是安装 husky 之后添加上的

你可以看到了,precommit 添加的命令,后面就是你要执行的动作,比如你要 eslint 检查代码规范,或者 跑测试,都可以

4、现在我们就来尝试一下提交

我们修改 ./src/index.js 文件,随便添加点内容

代码语言:javascript复制
var a = 111111

然后执行命令

代码语言:javascript复制
git add .  git commit -m "first commit"

发现 precommi 钩子被调用啦,并且执行了 eslint 检查我们的项目

然后因为本次eslint 检查不通过,所以提交是失败的

如果我们安装提示修正错误之后,再提交,就提交成功了

5、总结

所以我们只需要安装,然后再package.json 的 scripts 中添加命令

你要执行什么钩子,就在 scripts 中添加什么钩子

你要钩子调用时执行什么内容,你就配置相应的钩子的值,是 eslint 还是 测试什么的

怎么使用更加方便

其实我也知道 eslint 好,毕竟可以让项目更加规范些,自己开发项目也更加正规一些

但是奈何啊,每次检查都能爆出几百上千个错误,任谁都顶不住啊

是真的烦啊,特别如果你是项目中期引入的话,那你就等着被审判吧

所以现在有了一个包帮我们减少这方面的恐惧,每次检查的时候,只会检查本次的提交,不会把整个项目都抡一遍

这样相应的,错误就更少一些了,然后这样好处就是,谁的错误谁来抗哈哈哈

这个包的名字就是 lint-staged

1、先来安装

代码语言:javascript复制
npm i lint-staged -D

2、修改 package.json

代码语言:javascript复制
{        "scripts": {                "precommit": "lint-staged"    },        "lint-staged":{                "./src/*.js":[                        "eslint"        ]
    },
}

第一,把 scripts 中的 precommit 改成 lint-staged

第二,添加 lint-staged 字段

在这个字段中

属性名表示匹配哪些文件

属性值表示 这些文件要执行哪些命令(可以是字符串,可以是数组,如果是多个命令,就放一个数组里面)

在上面修改的内容中,我们可以看到,是 使用 eslint 检查 ./src/ 下所有的 js

然后当我们提交修改的时候,precommit 钩子就执行 lint-staged 命令,lint-staged 再执行他下面配置给哪些文件的命令

3、我们来试下水,看看是不是只会检测本次提交

既然要试水,我们肯定需要事先添加一个错误的文件,但是现在我们已经使用了 husky,该如何添加上这个错误文件呢?

我们上面已经讲过啦,那现在来玩玩

3.1、在 src 下添加一个含有错误的文件 err.js,内容随便,有错就行

代码语言:javascript复制
var b= 5555

3.2、提交这个文件 并跳过检测!

代码语言:javascript复制
git add err.jsgit commit -m "添加错误文件" --no-verify

3.3、好的这样,错误文件就已经被我们提交 了,现在我们需要再去提交一下我们的 index.js (随便修改点内容,但是不要有错误),我修改如下

代码语言:javascript复制
var a = 111111console.log(a)

3.4、然后提交这个文件

代码语言:javascript复制
git add ./src/index.jsgit commit -m "检测"

发现提交成功了,并且他没有去检测本次提交外的 err.js 文件,所以这次实验是成功的!

总结

好的,现在我们已经学会 使用 huskylint-stated 来让我们的项目 自动化了

但是然而这也只是基础,主要是记录下如何使用不过我们已经可以初步在项目中使用它啦

后面的话,我们还会记录更加复杂一些的用法!

大公司的每个项目都是必须使用这个提交检测的,所以我们是必须要学会的

0 人点赞