当公司大型项目迭代周期很长的时候,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/*"

将刚才的分支名改成通配符即可

Logo

一站式 AI 云服务平台

更多推荐