You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WSL2环境下运行自定义pre-commit Git钩子提示找不到匹配文件如何解决

问题原因

你遇到的报错本质是shell变量传参的解析逻辑错误,同时叠加了WSL2环境下的git路径兼容风险:

  1. 你把所有暂存文件路径拼成了单个字符串传给eslint、prettier等工具,工具会把整串当成一个文件名查找,自然匹配不到任何文件
  2. 如果你混用了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 14:18:03