Skip to content

报错 RPC failed; curl 56 / curl 92 / result=18 解决方法

git clone / git fetch 大仓库时,经常在传输过程中断,报类似:

text
error: RPC failed; curl 56 Recv failure: Connection was reset
error: RPC failed; curl 92 HTTP/2 stream 0 was not closed cleanly
error: RPC failed; result=18, HTTP code = 200
fatal: expected flush after ref listing
fetch-pack: unexpected disconnect while reading sideband packet

本质是HTTP 传输被中途打断。按下面几招基本能解决。

方法一:增大 http.postBuffer

传输大对象时缓冲区太小容易断,调大它:

bash
git config --global http.postBuffer 524288000   # 500MB

方法二:禁用 HTTP/2,改用 HTTP/1.1(专治 curl 92)

curl 92 HTTP/2 stream 这类报错,是 HTTP/2 在不稳定链路上出问题。切回 HTTP/1.1:

bash
git config --global http.version HTTP/1.1

这一招对 curl 92 和很多莫名中断非常有效。

方法三:放宽低速中断阈值

git 默认速度过低会主动断开,链路慢时会误伤:

bash
git config --global http.lowSpeedLimit 0
git config --global http.lowSpeedTime 999999

方法四:浅克隆,减少一次传输量

大仓库一次传太多容易断,先浅克隆再补历史:

bash
git clone --depth 1 https://github.com/用户/仓库.git
cd 仓库
git fetch --unshallow      # 之后需要完整历史再补

或用部分克隆只拿需要的对象:

bash
git clone --filter=blob:none https://github.com/用户/仓库.git

方法五:走代理 / 改 SSH

如果是链路被干扰导致的 reset:

  • 给 git 配 代理;
  • 或改用 SSH 443 协议克隆(SSH 传输不吃这套 HTTP buffer 的坑)。

方法六:result=18 多半是 MTU / 链路问题

result=18(transfer closed with outstanding read data)常与 MTU 或链路抖动有关。除上面几招外,可尝试:

  • 换网络环境(如手机热点)对比,确认是否本地网络问题;
  • 走代理绕开劣质链路;
  • 结合方法一 + 二 + 四一起用。

组合拳(推荐直接全上)

bash
git config --global http.postBuffer 524288000
git config --global http.version HTTP/1.1
git config --global http.lowSpeedLimit 0
git config --global http.lowSpeedTime 999999
# 再浅克隆
git clone --depth 1 https://github.com/用户/仓库.git

速查

报错首选
curl 92 HTTP/2 stream方法二(切 HTTP/1.1)
curl 56 Connection was reset方法五(代理/SSH)+ 方法一
result=18方法四(浅克隆)+ 方法五
大仓库反复断组合拳

小结

  • curl 92 优先切 HTTP/1.1;大仓库中断优先浅克隆 + 加大 postBuffer。
  • 链路被干扰(reset)最终解是 代理SSH 443
  • 还报 early EOF 的看 专文

本文仅供技术学习与研究,请遵守所在国家/地区法律法规。

本站为技术学习交流站点,与 GitHub, Inc. 无任何隶属或官方关系。所有内容仅供技术研究与学习,请遵守所在国家/地区的法律法规。