在项目中使用 Git Hooks

在日常开发中,我们通常会使用 git 来管理我们的项目,并在开发过程中使用 commit 、 push 等命令提交和推送代码,如果我们想在每次提交时都执行代码检查,我们如何自动化的去完成这些任务呢?

还好 git 为我们提供了 hooks 脚本,这些脚本在指定的某些事件之前或之后执行,比如你希望在每次 commit 的时候,执行 eslint 代码检查,只需要在对应的脚本文件中编写代码就能实现。

Git Hooks 工作原理

当我们使用 git init 初始化一个项目的时候,就会在项目目录下创建一个 .git 目录,这个目录是个隐藏文件夹,在 windows 中需要显示隐藏文件,在 mac 或 linux 中要使用 ls -a 才能看到,.git 存放的就是 git 仓库的所有数据,如果 .git 丢失,你本地仓库的历史数据也就丢失了。

.git 中有个 hooks 目录,这个目录下有一些示例脚本,并且以 .sample 为后缀,而且只有去掉 .sample 后缀,脚本文件才会执行。

常用的 hooks 有:

  • pre-commit:提交时运行,可以用来检查代码或提交信息;
  • post-commit:提交过程完成后运行,可以用来做发送通知之类的事情;
  • pre-receive:处理来自客户端的推送操作时运行;
  • post-receive:推送过程完成后运行,可以用于将代码部署到生产环境;

你可以根据需要随意修改这些脚本,当这些事件发生时 Git 会执行对应的脚本,更多 hooks 可以参考 https://githooks.com

使用 pre-commit 运行 eslint

知道了 Git Hooks 的工作原理后,我们尝试编写一个 git hooks,大多数前端项目,都会在 commit 前运行 npm run eslint 来检查代码是否符合预定的规范,如果每次都手动执行,显然比较麻烦,像这种重复性的工作,就可以放在利用 git hooks 来完成,因为我们是想在每次 commit 的时候执行检查,所以直接找到 .git/hooks/pre-commit.sample 文件,将 .sample 后缀去掉,并将内容改成如下代码:

#!/bin/sh
npm run eslint

这样在每次提交代码前,就会执行代码检查,当然前提是你项目中配置了 eslint。

在前端项目中使用 Git Hooks

虽然我们可以直接编写 hooks 脚本来完成一些任务,但当我们需要经常修改这些任务,或有多个任务要执行的时候,这种方式就会变的不那么方便,而且每个任务的输出结果,在终端上显示的也比较杂乱。开源社区为我们提供了可以将 hooks 写在 package.json 上的工具。

  • yorkie 允许我们在 package.json 中编写 hooks
  • lint-staged 可以将代码检查拆分成不同的步骤,并且在终端上输出美化后的信息,更加直观的显示每个步骤的执行情况。

安装 yorkie 和 lint-staged:

npm install yorkie lint-staged --save-dev
```

然后在 package.json 中加入如下代码,其中 lint-staged 根据你的 eslint 配置调整:

```json
{
  "gitHooks": {
    "pre-commit": "lint-staged"
  },
  "lint-staged": {
    "*.ts": ["eslint --fix", "prettier --write"],
    "*.scss": ["stylelint", "prettier --write"],
    "*.vue": ["eslint --fix", "prettier --write"]
  }
}

这样就不用每次去修改脚本文件了。

结束语

git hooks 除了自动执行代码检查,发送通知外,还可以和你的持续集成服务结合起来,做自动化打包部署等工作,合理的利用 git hooks 可以极大地提高开发人员的工作效率。

参考

Keywords

git hooks yorkie lint-staged gitHooks