使用 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。
参考资料: