WSL2环境下运行自定义pre-commit Git钩子提示找不到匹配文件如何解决
问题原因
你遇到的报错本质是shell变量传参的解析逻辑错误,同时叠加了WSL2环境下的git路径兼容风险:
- 你把所有暂存文件路径拼成了单个字符串传给eslint、prettier等工具,工具会把整串当成一个文件名查找,自然匹配不到任何文件
- 如果你混用了Windows版git和WSL内置git,git返回的路径格式会是Windows风格的
C:\xxx路径,WSL环境下的Node工具无法识别这类路径
修复步骤
1. 修改pre-commit脚本
把原脚本替换为下方内容,改用bash数组存储文件路径,彻底解决参数解析问题,同时兼容带空格的文件名:
#!/bin/bash # 改用数组存储暂存文件路径,过滤已删除的无效文件 STAGED_FILES=() while IFS= read -r file; do [[ -f "$file" ]] && STAGED_FILES+=("$file") done < <(git diff --cached --name-only --diff-filter=ACMR) # 无有效暂存文件直接跳过 if [ ${#STAGED_FILES[@]} -eq 0 ]; then echo "无待检测的暂存文件,跳过检查" exit 0 fi # 运行lint检查 echo "Running Linter..⚒️⚒️⚒️" ./node_modules/.bin/eslint "${STAGED_FILES[@]}" --quiet --fix LINTER_EXIT_CODE=$? # 运行prettier格式化 echo "Running Prettier..✨✨✨" ./node_modules/.bin/prettier "${STAGED_FILES[@]}" --ignore-unknown --write # 把自动修复后的文件重新加入暂存区 git add -f "${STAGED_FILES[@]}" # 校验lint结果 if [ $LINTER_EXIT_CODE -ne 0 ]; then echo "No, no, no! 请先修复上述lint错误..😠" exit 1 else echo "lint检查通过..👍" fi # 运行关联用例 echo "Running Tests" ./node_modules/.bin/jest --bail --findRelatedTests "${STAGED_FILES[@]}" --passWithNoTests JEST_EXIT_CODE=$? # 校验单测结果 if [ $JEST_EXIT_CODE -ne 0 ]; then echo "请修复失败的测试用例..🙏🙏🙏" exit 1 else echo "测试用例全部通过..👍" fi echo "🎉 检查全部通过..🔥🔥🔥" exit 0
2. 适配WSL2环境
- 确认使用WSL内置git,执行
which git查看返回路径,应为/usr/bin/git这类Linux路径,如果返回的是/mnt/c/开头的Windows git路径,调整WSL的PATH环境变量优先级,把Linux系统路径放在Windows挂载路径之前 - 尽量不要把项目存放在
/mnt/下的Windows挂载分区,这类路径的权限、性能都有兼容问题,建议迁移到WSL的原生文件系统(比如/home/你的用户名/目录下) - 给钩子脚本加可执行权限:
chmod +x ./git-hooks/pre-commit
内容的提问来源于stack exchange,提问作者slackermorris
相关产品推荐
相关产品推荐

