Unix 哲学 提供”尖锐“的小工具、其中每一把都意在把一件事件做好。–《程序员修炼之道 – 从小工到专家》
写在后面
做过前端的同学对 Hook 这个货色应该很理解吧,后端也是有 Hook 这种概念的,比方 Java 的@PostConstruct
,也是一种 Hook 的体现。简略来说,Hook 就是在执行某个事件之前或之后进行一些其余额定的操作。
举个栗子,张三当初要吃饭,那么吃饭就是一个事件,吃饭前和吃饭后就能够称为两个钩子。当初你想让张三在吃饭前洗下手,那么咱们就能够在吃饭前这个钩子这里,设置一个洗手的动作。张三在每次吃饭前,都会检查一下这个钩子,有什么要做的,都会照做。这样,就实现了咱们的需要。
Git 也是如此,在 Git 中也有许多的事件(commit、push 等等),每个事件也是对应了有不同的钩子的(如 commit 前,commit 后),那么咱们就能够在这些钩子这里配置一些本人须要执行的操作来实现各种各样的需要。
上面咱们看一下咱们在具体的我的项目中如何应用应用 git 的钩子。
git-hooks
咱们回到我的项目的根目录下。运行 ls -a
命令 -a
能够显示暗藏目录(目录名的第一位是.)。
咱们能够看到,存在一个 ”.git” 名称的文件夹。
事实上,在咱们我的项目中根目录下运行 git 命令时,git 会依据它来工作。接来下咱们进入到这个文件夹,进一步查看它外部的内容。
cd .git
ls -a
咱们发现它外部还挺有料!不慌,咱们这节课仅仅只讲到其中的一个内容 —hooks。能够看到,当前目录下存在一个 hooks 文件夹,顾名思义,这个文件夹提供了 git 命令相干的钩子。持续往里看。
cd hooks
ls -a
ok,那咱们咱们能够看到有很多 git 命令相干的文件名。比方pre-commit.sample pre-push.sample
。
回到正题,咱们冀望在 git 提交 (commit) 前,对咱们的代码进行检测,如果不能通过检测,就无奈提交咱们的代码。那么自然而然的,这个动作的机会应该是pre commit
, 也就是 commit 之前。
那么当初,咱们查看一下 pre-commit.sample
的内容。
# cat 命令能够查看一个文件的内容
cat pre-commit.sample
OK,它返回了这样的内容,是一串 shell 正文。翻译过去大略意思是,这是个示例钩子,而后咱们看到了这一句话
# To enable this hook, rename this file to "pre-commit".
意思是要启用这个钩子的话,咱们就把这个文件的后缀名去掉。
尽管这样对咱们本地来讲是可行的,但要留神,.git 文件夹的改变无奈同步到远端仓库。所以咱们冀望将 git-hook 的执行权移交到里面来。
好的,咱们回到我的项目的根目录下, 而后咱们新建一个文件夹,临时命名为.mygithooks
而后在此文件夹下,新增一个 git-hook
文件, 命名为pre-commit
,并写入以下内容:
echo pre-commit 执行啦
好了,咱们新建了本人的 git-hook,但此时 git 并不能辨认。上面咱们执行这行命令:
# 我的项目根目录下
git config core.hooksPath .mygithooks/pre-commit
上述命令给咱们本人的文件,配置了 git-hook 的执行权限。
但这个时候咱们 git commit 的话,可能会报这样的 waring,并且没有执行咱们的 shell:
hint: The 'pre-commit' hook was ignored because it's not set as executable.
hint: You can disable this warning with `git config advice.ignoredHook false`
这是因为咱们的操作系统没有给出这个文件的可执行权限。因而咱们得再执行这样一句命令:
chmod +x .mygithooks/pre-commit
ok!当初咱们尝试执行 git add . && git commit -m "any meesage"
咱们发现控制台日志会先打印 “pre-commit 执行啦”
这意味着胜利啦!
总结
也就是说,咱们搞 git-hook 的话,要分三步走:
- 新增任意名称文件夹以及文件 pre-commit(这个文件名字比方跟要应用的 git-hook 名字统一)!
- 执行以下命令来移交 git-hook 的配置权限
git config core.hooksPath .mygithooks/pre-commit
- 给这个文件增加可执行权限:
chmod +x .mygithooks/pre-commit
而后就胜利啦。
这时候咱们能够在 pre-commit 里写任意脚本,比方:
eslint src
当 eslint 扫描代码,呈现 error 时,会在完结扫描时将退出码设为大于 0 的数字。也就是会报错,这时候 commit 就无奈往下执行啦,咱们胜利的拦挡了此次错误操作。
husky
husky 在降级到 7.x 后,做了跟咱们上述同样的事。装置它之前,咱们须要在 package.json 中的 script 里,先增加
"sctript": {
//...others
"prepare": "husky install"
}
prepare 是一个 npm 钩子,意思是装置依赖的时候,会先执行 husky install 命令。这个命令就做了上述的 123 这三件事!咱们装置了 7.x 的 husky 会发现,我的项目根目录下生成了.husky 的文件夹。当然,7.x 的 husky 仿佛是有 bug 的,如果不能失常应用,那么咱们只须要验证两件事:
- 是否移交了 git-hook 的配置权限?执行命令 “git config –list” 查看 core.hooksPath 配置是否存在,是否正确指向了.husky。如果没有,咱们只须要手动的给加上就行:
git config core.hooksPath .husky
- 是否是可执行文件?参考上述总结中的 3 即可 这时咱们的 husky 就失常了。
@melody-core/melody-git-hook
这是 @六弦连夜撸进去的一个工具,跟 husky 有一样的性能。但没有这么多 bug。能够参考这个文档来应用它:(https://github.com/melody-core/melody-git-hook)