pre-commit钩子调用错误Node版本问题求助
解决pre-commit调用旧Node版本的问题
问题原因
手动执行pre-commit run --all-files正常,但提交时prettier钩子报错,核心原因是git钩子运行的环境变量PATH与终端环境不一致:你的终端已加载nvm配置,PATH优先指向v16.20.0的Node;但git钩子运行时未加载nvm环境,默认调用了系统路径下的v12.22.9版本Node。
解决方案
方法1:让prettier钩子加载nvm环境
修改.pre-commit-config.yaml中的prettier钩子,在运行prettier前先加载nvm配置并切换到指定版本:
- repo: https://github.com/pre-commit/mirrors-prettier rev: 'v3.0.2' hooks: - id: prettier files: \.(js|jsx|ts|tsx|css|scss)$ types: [ file ] # 根据你的shell类型选择对应的命令 # bash用户用这个: entry: bash -c 'source ~/.nvm/nvm.sh && nvm use 16 && prettier "$@"' -- # zsh用户用这个: # entry: zsh -c 'source ~/.zshrc && nvm use 16 && prettier "$@"' --
方法2:直接指定Node的绝对路径
如果不想加载nvm环境,可以直接用nvm管理的Node绝对路径来运行prettier:
- repo: https://github.com/pre-commit/mirrors-prettier rev: 'v3.0.2' hooks: - id: prettier files: \.(js|jsx|ts|tsx|css|scss)$ types: [ file ] entry: ~/.nvm/versions/node/v16.20.0/bin/node node_modules/prettier/bin/prettier.cjs
注:确保项目已通过npm install prettier安装了本地prettier,否则替换为全局prettier的路径。
方法3:配置git全局环境变量
通过git config直接修改钩子运行时的PATH,让nvm的Node路径优先:
# 将nvm的Node路径加入git的环境PATH git config --global environment.path "~/.nvm/versions/node/v16.20.0/bin:$PATH"
注:此方法会影响所有git项目,按需使用。
方法4:用direnv管理项目环境
- 安装direnv工具(Ubuntu可通过
sudo apt install direnv安装) - 在项目根目录创建
.envrc文件:
source ~/.nvm/nvm.sh nvm use 16
- 运行
direnv allow让direnv自动加载该配置,后续git钩子运行时会自动使用正确的Node版本。
验证方法
可以添加一个local钩子打印钩子运行时的PATH,确认配置是否生效:
- repo: local hooks: - id: check-path name: Print hook PATH entry: echo $PATH language: system pass_filenames: false always_run: true
提交代码时查看输出,确认~/.nvm/versions/node/v16.20.0/bin是否在PATH的前列。
内容的提问来源于stack exchange,提问作者HarryKane
相关产品推荐
相关产品推荐

