在我的开源项目 SwanLab 中,通过 husky 实现了几个 git hook,以实现代码提交时的代码风格格式化、代码格式检查等等操作,以规范和检查代码。但是因为环境变动,触发了一些bug:
在我使用 github desktop(一个 git 操作的 ui 工具)将本地的提交推送到远程时,出现了错误(但是使用命令行进行 git push 是正常的):
nvm is not compatible with the “PREFIX” environment variable: currently set to “/usr/lib/github-desktop/resources/app/git”
Rununset PREFIX
to unset it.
.husky/pre-push: 4: npm: not found
error: failed to push some refs to ‘github.com:SwanHubX/swanlab.git’
husky - pre-push hook exited with code 127 (error)
husky - command not found in PATH=/usr/lib/github-desktop/resources/app/git/libexec/git-core:/home/swan/.cargo/bin:/home/swan/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin
这是在 husky 中的 pre-push 中发生的错误,在 pre-push 中执行了一个 npm 的命令。
上面的错误其实是两个错误合成的:
- “PREFIX” environment variable
- .husky/pre-push: 4: npm: not found
“PREFIX” environment variable
这个错误的修复在错误信息中已经给出了,只需要在 husky 脚本中单独写一行即可。
unset PREFIX
.husky/pre-push: 4: npm: not found
这个错误是因为 husky 脚本在执行的时候,环境变量没有找到,所以只需要在执行前手动标注导出一下环境变量即可:
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
所以最终可以这样同时解决两个错误:在 .husky/pre-push
中,执行 npm 操作前写入:
unset PREFIX
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
但是
直接在仓库的 git hook 中修改在某些情况下并不好,就例如我所在的项目团队,大家开发使用的操作系统涵盖 linux、mac、windows,上面的解决方式可能在 windows 上并不起效果。
并且这个 bug 大概率是和本机环境相关,属于异常情况,本来不添加这些环境设置也能正常运行。所以最好的办法是修改自己本机的 husky 配置。
下面以 Ubuntu 为例。
一般项目的 husky 中的 hush.sh 里有这么一段配置:
if [ -f ~/.huskyrc ]; then
debug "sourcing ~/.huskyrc"
. ~/.huskyrc
fi
说的是,如果当前用户的用户目录下有 .huskyrc
这个脚本,那么运行这个脚本。所以,我们可以将上面写到项目工程文件中的环境配置脚本,剪切到 ~/.huskyrc
中(没有这个文件就自己创建一个)。
这样既解决了环境问题,又不会污染项目脚本。