最近在公司电脑clone某些gitlab仓库的时候总会碰到下面这个报错:
fetch-pack: unexpected disconnect while reading sideband packet
按照网上和Gitlab的KM,搜索到四个解决方法:
- 关闭git压缩,这个应该是在host端的压缩
git config --global core.compression 0
- 仓库太大导致失败,控制每次克隆深度:
git clone --depth 1 <repo_URI>
git fetch --unshallow
# or, alternately,
git fetch --depth=2147483647
# Now, do a regular pull:
git pull --all
- 修改其他git的参数(内存、缓存等)
[core]
packedGitLimit = 512m
packedGitWindowSize = 512m
[pack]
deltaCacheSize = 2047m
packSizeLimit = 2047m
windowMemory = 2047m
- 修改httpbuffer
git config --global http.postBuffer 524288000
这四个方法基本无效,而且我看了一下失败的仓库大小,基本都是非常小的,而且没有特别大的提交,不可能因为缓存区不足的原因。而且我还是走ssh协议,方法4基本没有用。但是方法提示了我,有没可能是ssh协议本身的问题?于是在尝试用sourcetree clone成功后确定了这个问题。 sourcetree的git是跟命令相同版本,唯一的区别就是sourcetree使用了putty/plink作为ssh的传输命令,命令行是用系统的ssh(8.1.0.0p1-beta),从scoop安装的。
遂重新安装git for windows,使用安装包自带ssh和mintty后解决。我看全网似乎没有提到跟这个相关。当然你也可以选择putty/plink作为默认的ssh,不过为了不折腾还是用推荐的选项(毕竟用的人更多)。
我甚至怀疑之前其他仓库时不时出现pull失败是跟这个ssh相关(不过现在已经没办法证实了)
PS:自带的ssh没有办法使用windows的ssh-agent确实有点麻烦,要用mintty启动ssh-agent。