不管在什么类型的项目中,当使用git相关的pull或者clone时,有时候会遇到以下错误:
error: RPC failed; curl 18 HTTP/2 stream 5 was reset8.00 KiB/s
Early EOF
Expect 5032 Kib或者
error time out
忘记给错误截图了,但是问题基本是那个类似是上面的报错。
从上面的报错来看,其实是在curl的时候,网络disconnect或者其他类似的io出错。
这个问题的出现其实就是由于网络超时导致的package没有传输完成,或者是由于缓冲区小了导致的io error。
面对这样的问题,有2种思路是可以思考的。
- 增加git clone的时间,防止由于time out而导致的终止链接,即增大buffer。
- 升级curl到8.2.1以上。【推荐先尝试这个方式】
1. 升级curl
我们先来说升级curl的方式,其实在curl的github上(https://github.com/curl/curl/issues/11353)就已经有相关的issue提出来,而且作者也说了8.2.1之前的版本确实会复现这样的问题,所以很简单,直接查看本地的curl版本,如果低于8.2.1版本,那么直接去升级就好了。
查看curl的版本:
curl --version

升级本地的curl版本:
brew install curl
注意:
在Mac上通过brew安装的curl,有可能没有自动配置环境变量,甚至安装之后查看curl的版本,还是之前的版本。所以需要进一步配置一下环境变量。
通过brew info查看刚才安装的curl:
brew info curl

然后,按照截图的蓝色框框中的内容,配置一下环境变量:
echo 'export PATH="/usr/local/opt/curl/bin:$PATH"' >> ~/.zshrc
然后再检查curl的版本:
确认版本正确之后,再去执行git相关的操作,验证是否可行。
我自己的问题是在更新curl后得到解决。
2. 增加git clone的时间
很容易理解,增加clone时间其实就是希望哪怕网速再慢,也可以慢慢clone下来,而不会导致time out而链接中断。
那么常用的设置命令是:
git config --global http.postBuffer 157286400
这里是把缓冲区设置为150M大小,git默认的是1M。
其实很多程序员对此存在争议,认为这个设置是没有必要的,但仍然有程序员通过这个设置解决了自己的问题。
对于这个设置,由于我自己通过这个命令没有解决我遇到的问题,所以暂时不敢苟同。
3. 另外还有一种解法,就是使用http/1.1而不是http/2来进行传输
这个方式我没尝试过,但是有一定的道理,http/2的协议比http/1.1确实多了很多限制,那么更改成http/1.1,或许可以解决transfer中遇到的问题,仅作参考吧。
这种方式的解法是:
先设置:
git config --global http.version HTTP/1.1
当执行完git相关的操作后,再设置:
git config --global http.version HTTP/2