使用 husky 管理git hooks

192 阅读2分钟

使用 husky 管理git hooks

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情

git hooks

Git 支持在特定的重要动作发生时触发自定义脚本。hook 都存在 Git 目录下的 hooks 的子目录中。

以 mac 为例,如果你的项目是使用 git 进行版本控制的,那么使用 sihft+cmmand+.就可以看到 .git 目录,然后在其中有 hooks 文件,你会看到很多示例的名字都是以 .sample 结尾,这些都是 shell 示例脚本。只需要去掉后缀名称就可以启用它们。

客户端 Hook

存在你本地 .git/hooks 文件内,比如你在 commit,push 等操作时触发。

客户端的 hook 分为三种类型

  • 提交工作流 Hook

    • pre-commit
    • prepare-commit-msg
    • commit-msg
    • post-commit
  • 电子邮件工作流 Hook

    • applypatch-msg
    • pre-applypatch
    • post-applypatch
  • 其他 Hook

    • pre-rebase
    • post-rewrite
    • post-checkout
    • post-merge
    • pre-push
    • pre-auto-gc

服务端 hook

由管理员可管理,在服务端上使用 hook 对项目进行相关操作,比如接收到被推送的提交等操作

  • Pre-receive
  • update
  • Post-receive

Husky

客户端 Hook,在.git/hook 内只能在本地自己有效,无法将代码推送上去,在团队协作的时候,大家无法共用,所以有一个解决方案就是 使用 Husky.

安装

npm install husky --save-dev

要让项目可以使用 husky 必须,要初始化一下

husky install

为了能够自动触发其 git hook ,需要在 package.json 配置启动命令

{
  "scripts": {
    "prepare": "husky install"
  }
}

前期动作准备完成之后,就可以创建一个 Hook ,使用命令 husky add

husky add .husky/pre-commit 

这样你就可以在 .husky 下看到 pre-commit 文件,就可以在里面创建要执行的事情,因其是个 shell 脚本,如下面例子,我让其执行某个命令

#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
​
npm run runScript

然后在项目的 package.json 中配置了一个 runScript 命令,是让其执行一个 js 脚本

{
  "scripts": {
    "prepare": "husky install",
    "runScript": "node ./script/sayHello.js"
  }
}

这样在每次 git commit 之前都会执行 js 脚本。

Husky 让我们方便配置 git hook ,但也需要注意它不支持服务端的 Hook。

参考资料: