15. git-hooks 与 husky

549 阅读2分钟

为了保证团队里的开发人员提交的代码符合规范,我们可以在开发者上传代码时进行校验。 我们常用 husky 来协助进行代码提交时的 eslint 校验。在使用 husky 之前,我们先来研究一下 git-hooks 。

一、git-hooks

执行命令,进入到 hooks 文件夹:

cd .git/hooks

image.png

我们期望在 git commit 前,对代码进行检测,如果不能通过检测,就无法提交代码。查看 hooks 中的文件,有个 pre-commit.sample,这是一个模板文件,里面写了一些示例,使用 cat 命令查看它的内容:

cat pre-commit.sample

其中有一句注释:

# To enable this hook, rename this file to "pre-commit".

意思是要使用这个钩子(hook),就要把这个文件重命名成 pre-commit。我们可以保留这个 pre-commit.sample 文件,创建一个新的 pre-commit 文件并给它添加可执行权限:

touch pre-commit
chmod +x ./pre-commit

pre-commit 文件中编写脚本:

npx eslint ./src

现在再执行 git commit 时,就会运行 pre-commit 中的脚本,使用 ESLint 检查代码。

重要的是,虽然这样的改动对本地来说是可行的,但 .git 文件夹无法同步到远程仓库,意味着我们本地的改动不会被团队其他人同步到,所以我们要将 git-hook 的执行权移交到外面来。

在根目录下创建 .githooks 目录,并在 .githooks 中创建 pre-commit 文件:

mkdir .githooks
cd .githooks
touch pre-commit

pre-commit 中写:

npx eslint ./src

此时提交代码,git 默认读取的仍然是 .git 目录中的 hooks,我们需要配置 git 读取根目录下的 .githooks

git config core.hooksPath .githooks    # 配置 git-hook 的执行权限

并给这个文件添加可执行权限:

chmod +x .githooks/pre-commit

此时提交代码,就会运行 .githooks/pre-commit 中的脚本,使用 ESLint 检查代码。

二、husky

husky 官网

需要注意的问题:

  1. 使用 husky 生成的 pre-commit 文件如果没有可执行权限,需要自己手动添加可执行权限:

    chmod +x .husky/pre-commit
    
  2. 查看是否移交了 git-hook 的配置权限:

    git config --list
    

    查看 core.hooksPath 配置是否存在,是否正确指向了 .husky。如果没有,需要手动添加:

    git config core.hooksPath .husky