Git Apply报错:failed to read: No such file or directory 排查求助
Git Apply报错
error: git apply: failed to read: No such file or directory的排查与解决 问题描述
在Windows和Linux系统上执行git apply时均触发错误:error: git apply: failed to read: No such file or directory,退出码为128,且无额外错误详情。复现步骤如下:
# 创建补丁 git clone https://github.com/dotnet/llvm-project git -C llvm-project diff --patch --binary --output ../llvm.patch 4b825dc642cb6eb9a060e54bf8d69288fbee4904..30e9e6bc2e9f04e0a75daf4b8088ee91f66069da -- ':(glob)**/*' ':(exclude,glob)**/*.dll' ':(exclude,glob)**/*.Dll' ':(exclude,glob)**/*.exe' ':(exclude,glob)**/*.pdb' ':(exclude,glob)**/*.mdb' ':(exclude,glob)**/*.zip' ':(exclude,glob)**/*.nupkg' # 尝试应用补丁 mkdir foo git -C foo init git -C foo apply --cached --ignore-space-change ../llvm.patch
已知现象:
- 补丁大小1GB,此前成功应用过3GB补丁;排除bolt、lldb等目录后,补丁可正常创建和应用
- 单独处理lldb目录或仅排除lldb目录均正常,但所有内容合在一起时触发错误
- 用procmon监控未获取有效信息
排查与解决步骤
1. 检查补丁完整性与格式
- 执行预检查命令定位具体问题:
git apply --check ../llvm.patch - 用GNU patch工具做预应用测试(Linux直接用,Windows需安装GNU patch):
patch --dry-run -p1 < ../llvm.patch - 检查补丁是否被截断:
查看末尾是否存在不完整的diff块或异常字符tail -50 ../llvm.patch
2. 简化路径匹配规则
原创建补丁命令中:(glob)**/*与排除规则的组合可能存在匹配逻辑冲突,尝试简化路径参数:
# 替换原diff命令的路径匹配部分 git -C llvm-project diff --patch --binary --output ../llvm.patch 4b825dc..30e9e6b -- . ':(exclude)**/*.dll' ':(exclude)**/*.exe' ':(exclude)**/*.pdb' ':(exclude)**/*.mdb' ':(exclude)**/*.zip' ':(exclude)**/*.nupkg'
用.代替:(glob)**/*,避免递归匹配的潜在冲突
3. 拆分补丁分批应用
既然单独处理lldb或其他目录正常,可将补丁拆分为多个部分:
- 创建非lldb部分的补丁:
git -C llvm-project diff --patch --binary --output ../llvm-non-lldb.patch 4b825dc..30e9e6b -- . ':(exclude)**/lldb/**' ':(exclude)**/*.dll' ':(exclude)**/*.exe' ':(exclude)**/*.pdb' ':(exclude)**/*.mdb' ':(exclude)**/*.zip' ':(exclude)**/*.nupkg' - 创建lldb部分的补丁:
git -C llvm-project diff --patch --binary --output ../llvm-lldb.patch 4b825dc..30e9e6b -- **/lldb/** - 分别执行
git apply应用两个补丁:git -C foo apply --cached --ignore-space-change ../llvm-non-lldb.patch git -C foo apply --cached --ignore-space-change ../llvm-lldb.patch
4. 升级Git版本
该问题大概率是Git路径匹配或大补丁处理的bug,尝试升级到最新稳定版Git(如2.40+),修复已知兼容性问题
5. 检查路径长度限制
- Windows下默认路径长度限制为260字符,可通过修改组策略或注册表启用长路径支持
- 检查补丁中是否存在超长路径:
对超长路径文件单独处理,或调整仓库目录层级缩短路径grep -E '^diff --git' ../llvm.patch | awk '{print $3}' | awk '{print length, $0}' | sort -nr | head -20
内容的提问来源于stack exchange,提问作者Premek Vysoky
相关产品推荐
相关产品推荐

