快读:
报错原因:pre-commit脚本执行错误,检查pre-commit代码,删除部可能报错的代码,保留husky原本代码
解决
在项目中开启了 husky 去校验代码,在 git 提交代码的时候,部分同学出现了 husky - pre-commit hook exited with code 3 (error)
这是因为在提交代码的时候,执行 pre-commit 脚本的时候,发生错误导致的返回 code 3 (error)
例如我团队里的项目 pre-commit
pre-commit内容:
#!/bin/sh
. "$(dirname "$0")/\_/husky.sh"
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
if test -f ".nvmrc"; then
nvm use
fi
npx --no-install lint-staged
参考https://github.com/typicode/husky/issues/1176的解决方法
删掉了中间部分的代码,保留 husky 最原始的脚本
#!/bin/sh
. "$(dirname "$0")/\_/husky.sh" // 拉取husky核心文件
// export NVM_DIR="$HOME/.nvm"
// [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
// if test -f ".nvmrc"; then
// nvm use
// fi
npx --no-install lint-staged //执行脚本
这样就可以校验了,这是最简单暴力的方法解决问题
但是前人添加中间脚本,必然有其作用,不该轻易删除
本着探究报错原因的研究精神,继续研究
讲脚本内容投喂给 chatgpt,看看脚本的作用是什么:
来自 AI 的回答:
//这是脚本文件的 shebang,指定要使用的解释器。
#!/bin/sh
//这是引用 husky 的核心脚本文件。它将 husky 脚本的功能导入到当前的钩子脚本中
. "$(dirname "$0")/\_/husky.sh"
//这是将 NVM (Node Version Manager) 的安装路径保存到一个环境变量中
export NVM_DIR="$HOME/.nvm"
//这个条件语句检查是否存在 NVM 的配置文件 nvm.sh,如果存在,则加载该文件。
//这样可以确保在执行脚本时正确设置 Node.js 版本。
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
//这个条件语句检查是否存在项目根目录下的 .nvmrc 文件。
//如果存在,它会使用 nvm 命令根据 .nvmrc 文件中指定的 Node.js 版本来切换 Node.js 环境。
if test -f ".nvmrc"; then
nvm use
fi
// npx --no-install lint-staged:这个命令使用 npx 来运行 lint-staged 工具,
//用于在提交前对暂存的文件进行 linting 操作。--no-install 选项告诉 npx 不要安装缺少的依赖,
//而是使用项目中已经安装的依赖。
npx --no-install lint-staged
由此可见,中间的脚本是为了保证执行脚本的时候用的是系统默认的 node 版本,并且是通过 nvm 来保证的
那么第一个可能报错的原因找到了:有些同学没有安装 nvm,就不会存在 nvm 目录,那么 export NVM_DIR="$HOME/.nvm"就会报错
但是本人已安装 nvm,如为什么仍会报错 husky - pre-commit hook exited with code 3 (error)
分析+问cgatgpt后得出结论,我的 nvm 目录没有 nvmrc,也就是指定默认的 node 版本,导致执行到 nvmrc 的时候报错
接下来就设置下 nvmrc 文件
问了 chatgpt:执行
nvm alias default <version> //设置默认版本
nvm version > nvmrc //把版本存入 nvmrc
再次在代码文件夹终端执行
git add .
git commit -m “feat: xxxxx”
提交通过!
总结:
1.husky - pre-commit hook exited with code 3 (error)
指的是执行 pre-commit 脚本的时候报错了
2.参考博客,删掉容易报错的部分,可以解决
3.探究报错原因,问 chatgpt 脚本的内容
4.检查脚本,发现必须安装 nvm,且必须在 nvmrc 中加入版本信息
最后,如果大家遇到 husky - pre-commit hook exited with code 3 (error),不要照搬以上解决方法,毕竟每个项目的 pre-commit 脚本可能不一样,但是可以参照解决问题的思路,借助博客和 AI 工具解决问题