Skip to content

前言

githooks

Git Hooks 就是在 Git 执行特定事件(如commit、push、receive等)时触发运行的脚本,类似于“钩子函数”,没有设置可执行的钩子将被忽略。

在项目的 .git/hooks 目录中,有一些 .sample 结尾的钩子示例脚本,如果想启用对应的钩子,只需手动删除后缀,即可。(删除某一个 hook 的后缀 .sample 即可启用该 hook 脚本,默认是不启用的。)

【但是,我们一般不去改动 .git/hooks 里面的文件,因为我们使用 husky 】

husky

husky 是一个为 git 客户端增加 hook 的工具。安装后,它会自动在仓库中的 .git/ 目录下增加相应的钩子;比如 pre-commit 钩子就会在你执行 git commit 的触发。

那么我们可以在 pre-commit 中实现一些比如 lint 检查、单元测试、代码美化等操作。当然,pre-commit 阶段执行的命令当然要保证其速度不要太慢,每次 commit 都等很久也不是什么好的体验。

lint-staged

lint-staged,一个仅仅过滤出 Git 代码暂存区文件(被 git add 的文件)的工具;这个很实用,因为我们如果对整个项目的代码做一个检查,可能耗时很长,如果是老项目,要对之前的代码做一个代码规范检查并修改的话,这可能就麻烦了呀,可能导致项目改动很大。

所以这个 lint-staged,对团队项目和开源项目来说,是一个很好的工具,它是对个人要提交的代码的一个规范和约束。

执行

下载包

yarn add husky lint-staged -D

配置script

js
//package.json
"scripts": {
    ...
    "preCommit": "lint-staged"
  },
"lint-staged": {
  "src/**/*.{js,vue}": [
    "eslint --fix",
    "git add"
  ]
 }

初始化husky

这个时候本地是没有.husky的文件夹的,需要初始化。

npx husky-init

创建husky钩子

执行下述命令会在.husky下创建一个pre-commit的文件

npx husky add .husky/pre-commit "npm run preCommit"

整个流程路线

  1. commit触发hooks的pre-commit
  2. hooks指向husky
  3. husky调用了npm run preCommit
  4. npm run preCommit 调用 lint-staged
  5. lint-staged 调用了package.json内lint-staged脚本

不得不说,husky更新到6版本后比之前的操作要麻烦很多,需要在注册脚本,还多了个.husky的的文件,使用成本比之前高了不少

ps:常见错误原因

钩子如果没有触发

  1. 查看一下.git/config文件的hooksPath 路径是否指向了husky
hooksPath = .husky
  1. .husky/pre-commit文件是否被创建

commit报错:miss test

看一下.husky/pre-commit里有没有多余的操作例如:npm run test,删掉即可