跳到主要内容

git-hooks

1、Git 能在特定的重要动作发生时触发自定义脚本

2、在开发员提交之前执行检查脚本

3、但是需要把脚本放在本地的 .git/hooks 目录下,不方便在团队内推广

  • 因此就出现了husky

4、这样可以避免不符合规范的代码污染远程仓库

当我们执行git操作时,自动触发配置的脚本;常用的hooks有pre-commit和commit-message

husky​

配置​

  • 安装
bash
pnpm add husky -D
  • 初始化
    • 会在根目录生成一个 .husky 文件夹
bash
pnpm exec husky init
  • 可选:package配置
json
// package.json
"scripts": {
// 新增这一行
"prepare": "husky install",
...
},
  • 设置prepare命令的目的是, 其他用户安装项目依赖执行prepare命令的时候,会统一生成.husky文件夹,

添加pre-commit钩子​

bash
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

pnpm exec lint-staged

#!/bin/sh和#!/usr/bin/env sh区别​

"#!/bin/sh" 和 "#!/usr/bin/env sh" 都是 shebang 行,它们都用于在脚本文件的开头指定执行脚本的解释器。

但是,它们的区别在于它们使用不同的路径来指定解释器。

"#!/bin/sh" 直接使用解释器的绝对路径,这通常指定为 Bourne shell(sh)。因此,该 shebang 行告诉系统使用 Bourne shell 来解释和执行脚本。

"#!/usr/bin/env sh" 使用 "/usr/bin/env" 来搜索解释器。这意味着系统会在 PATH 环境变量中列出的目录中查找解释器。在这种情况下,"sh" 指定了解释器,通常也是 Bourne shell。因此,该 shebang 行也会告诉系统使用 Bourne shell 来解释和执行脚本。

总的来说,"#!/bin/sh" 和 "#!/usr/bin/env sh" 的区别在于它们使用不同的方式来指定解释器的路径。前者使用绝对路径,后者使用相对路径。

遇到问题​

执行husky之后,提交commit,出现找不到node问题

husky - pre-commit hook exited with code 1 (error)

'node' 不是内部或外部命令,也不是可运行的程序

  • 方式一:
    • 1、检查node、nvm环境变量
    • 2、步骤一不行的话,试试重装git、node、nvm环境
  • 方式二:
    • 注意:这个命令是用于取消设置项目中使用的 Git 钩子文件目录,执行之后,gitHooks会失效
bash
# 取消设置项目中使用的 Git 钩子文件目录
git config --unset core.hooksPath