git高丢包时卡在receiving objects阶段,需禁用压缩(core.compression 0)、增大缓冲区(http.postbuffer 50mb)、禁用低速限制、启用浅克隆(--depth 1)及ssh走443端口等容错优化。

网络高丢包时,Git 默认的传输机制容易因重传失败或超时而卡死在 Receiving objects 阶段。这不是单纯“慢”,而是链路不稳定引发的协议级中断。关键在于让 Git 更容忍丢包、减少依赖单次长连接、降低对底层 TCP 流畅性的要求。
降低压缩强度,减少解压失败风险
高丢包环境下,zlib 压缩后的数据包一旦部分丢失,接收端解压极易报 early EOF 或 invalid index-pack output。关闭压缩可绕过该环节:
- 全局禁用传输压缩:git config --global core.compression 0
- 临时生效(仅本次克隆):git -c core.compression=0 clone
- 补充关闭 pack 层压缩:git config --global pack.threads 1(避免多线程并发加剧丢包影响)
增大缓冲区并放宽超时限制
默认缓冲区小、超时短,在丢包率高时频繁触发重试或断连。调整后能提升单次传输容错窗口:
适用于以下场景:(1)用户提供 GitHub 仓库 URL 或本地仓库路径,并请求将其转换为其他格式;(2)用户请求导出 GitHub 仓库……
- 扩大 HTTP/HTTPS 缓冲(适用于 HTTPS 克隆):git config --global http.postBuffer 52428800(50MB)
- 延长连接与读取超时(单位:秒):git config --global http.lowSpeedLimit 0 和 git config --global http.lowSpeedTime 0(禁用低速阈值判断)
- 对 SSH 克隆,可在 ~/.ssh/config 中为对应主机添加:
ServerAliveInterval 30
ServerAliveCountMax 3(主动保活,防中间设备断连)
启用浅层与按需拉取策略
不追求完整历史,直接削减待传输对象量,从源头规避丢包累积效应:
- 首次克隆用浅层:git clone --depth 1 --no-single-branch
- 后续需要更多历史时,分批扩展:git fetch --depth=100 → git fetch --depth=1000(逐步推进,失败成本低)
- 跳过大体积二进制文件:git clone --filter=blob:none
(适合含大量图片、构建产物的仓库)
切换协议与端口增强连通性
丢包常集中在特定路径(如企业防火墙对 22 端口限速严重)。换协议或端口可绕过问题链路:
- SSH 改走 443 端口(多数网络允许):在 ~/.ssh/config 中配置
Host github.com
HostName ssh.github.com
Port 443 - HTTPS 克隆换国内镜像源(如清华源):
git clone https://github.com.cnpmjs.org// .git - 确认是否使用了代理,临时关闭:git config --global --unset http.proxy 和 git config --global --unset https.proxy










