git项目过大,拉取项目代码报错,error: RPC failed; curl 18 transfer closed with outstanding read data remaining
当公司大型项目迭代周期很长的时候,git仓库出现大量分支,提交记录,这时候如果我们拉取全部仓库就会出现,拉取失败的情况。
当公司大型项目迭代周期很长的时候,git仓库出现大量分支,提交记录,这时候如果我们拉取全部仓库就会出现,拉取失败的情况
error: RPC failed; curl 18 transfer closed with outstanding read data remaining
error: 5947 bytes of body are still expected
fetch-pack: unexpected disconnect while reading sideband packet
fatal: early EOF
fatal: fetch-pack: invalid index-pack output
在网上找到了很多方式 例如增加缓存、改成ssh方式等,都效果并不好
经过实测可以使用depth方式拉取
但是如果项目真的很大,缓存都拉爆了,那么就需要手动的调节缓存大小了
查看缓冲区
git config --global --get http.postBuffer
设置缓冲区 还有其他的优化方案
将 Git 的 HTTP 上传缓冲区设置为 500 MB。
git config --global http.postBuffer 524288000
git config --global core.compression 0 # 禁用压缩(对大文件可能更快)
git config --global http.lowSpeedLimit 0
git config --global http.lowSpeedTime 999999 # 防止超时
方法一 拉取全部分支(但是单个分支的历史提交记录不全)
执行下面的命令会获取所有分支的最后一次提交记录
git clone --depth=1 --no-single-branch --branch master 仓库地址
如果需要之前的提交记录,(如果非常大,获取全部有可能失败,那么就尝试第二种方法,获取单个的),切换到某一分支执行。
#命令执行之后会卡顿,不是没有反应,是反应慢!!!
git fetch --unshallow
如果提交历史很多,上面的命令失败的可能性很大,不过一般来说,我们不会纠结到很久以前的提交记录,所以建议只对需要的分支进行拉取历史
#执行下列命令之后会卡顿,不是没有反应,是反应慢!!!
# 获取某个分支的最近20条
git fetch --depth=20 origin 分支名
#或者 获取某个日期之后的记录
git fetch --shallow-since="2025-01-01" origin 分支名
方法二 先拉取单个分支的部分历史,再拉取另外需要处理的分支(可以获取全部的git历史记录,但是需要一个分支一个分支进行处理)
第一步 拉取仓库其中一个分支
git clone --depth=1 -b [分支名] git地址
假设我拉取一个master分支
git clone --depth=1 -b master git地址
意味着只克隆最近的一次提交记录,这样可以加快克隆速度并减少下载数据的大小
#执行下列命令之后会卡顿,不是没有反应,是反应慢!!!
git pull --unshallow
git pull:这是 Git 的常用命令,用于从远程仓库获取最新的变更并自动合并到当前分支。这通常包括两个操作:git fetch 后跟 git merge。
–unshallow:这个选项用于将仓库的浅克隆状态转换为非浅克隆状态。浅克隆仓库通常只包含有限的提交历史(如前面提到的 git clone --depth=1 仅克隆最近的一次提交),而使用 --unshallow 会下载完整的提交历史,使得本地仓库拥有远程仓库的所有历史数据。
第二步 拉取其他分支
因为项目开发中可能会要不同的分支之间进行一些操作,所以只有一个分支的时候是无法满足的。
这时候执行下面的命令,把分支名换成你需要的分支的名称,然后再次git pull
这个分支也就拉取成功了
git config remote.origin.fetch "+refs/heads/分支名:refs/remotes/origin/分支名"
#执行下列命令之后会卡顿,不是没有反应,是反应慢!!!
git pull
用于配置 Git 仓库中特定远程仓库的抓取(fetch)规则。这里的各个组成部分意味着:
git config:这是一个用于修改 Git 配置文件的命令,它可以影响 Git 的行为和设置。
remote.origin.fetch:这指定了配置选项,其中 remote.origin 表示名为 origin 的远程仓库,fetch 是该远程仓库的抓取规则。
“+refs/heads/分支名:refs/remotes/origin/分支名”:这是一个引用规格(refspec)指定:
- 符号表示强制更新,即使存在冲突也会覆盖本地更改。
refs/heads/分支名 是远程仓库中的分支路径。
refs/remotes/origin/分支名 是本地仓库中用于跟踪远程分支的路径。
第三步 防止改动之后,拉取错仓库
git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
将刚才的分支名改成通配符即可
更多推荐




所有评论(0)