Git递归克隆带子模块与--filter=blob:none时退出码128故障排查
故障原因
--filter=blob:none这类部分克隆过滤器会让Git在克隆时和远程仓库多次往返协商需要拉取的对象,高延迟慢速网络下,这个协商过程的耗时很容易超过Git默认的超时阈值,导致子模块克隆进程直接报错退出(代码128)。- 子模块的克隆是独立的子进程,Git对其超时的处理逻辑比主项目更严格,主项目能扛过的延迟,子模块可能直接触发超时。
http.postBuffer参数只影响大文件传输的缓冲区大小,和对象协商阶段的超时问题完全无关,所以调整它没用。
解决方法
调高子模块克隆的超时阈值:执行以下命令全局设置更长的超时时间,给高延迟网络足够的协商时间:
git config --global submodule.fetchTimeout 600 git config --global http.lowSpeedLimit 0 git config --global http.lowSpeedTime 900(
submodule.fetchTimeout设为600秒即10分钟,http.lowSpeedTime设为900秒,让Git不会因为长时间低速传输就断开连接)改用更温和的部分克隆过滤器:放弃
--filter=blob:none,换成只过滤大文件的规则,减少对象协商的次数,比如:git clone --filter=blob:limit=1m --recurse-submodules <项目地址>这个规则只会跳过大于1MB的二进制文件,既节省带宽,又降低超时概率。
分步克隆子模块:先单独克隆主项目,再逐个处理子模块,灵活调整每个子模块的克隆策略:
- 先克隆主项目(不带子模块):
git clone --filter=blob:none <主项目地址> cd <主项目目录> - 初始化并克隆子模块,可单独加超时参数:
git submodule update --init --recursive --fetch-timeout 600 - 如果某个子模块还是失败,单独进入子模块目录,取消部分克隆限制:
cd <子模块路径> git fetch --unshallow
- 先克隆主项目(不带子模块):
开启HTTP持久连接:减少高延迟环境下重复建立连接的开销,提升稳定性:
git config --global http.keepAlive true git config --global http.maxRequests 100
内容的提问来源于stack exchange,提问作者AstroBrick
相关产品推荐
相关产品推荐

