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

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
    
  • 检查补丁是否被截断:
    tail -50 ../llvm.patch
    
    查看末尾是否存在不完整的diff块或异常字符

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:23:19