为什么克隆的存储库比获取的存储库大 10 倍?

Bil*_*oor 5 git

我们有一个远程仓库,其大小已经爆炸(1.4G 到 14G)。我们正在尝试找出此存储库大小增加的原因并解决问题。

在这个过程中我们注意到 git clone 和 git fetch 之间的显着差异。

如果我们克隆仓库,克隆的仓库也是 14G。

git clone <remote>
Run Code Online (Sandbox Code Playgroud)

相反,如果我们从远程初始化并获取,本地存储库将恢复到预期的 1.4G。

git init
git remote add origin <remote>
git fetch
Run Code Online (Sandbox Code Playgroud)

我认为这两组命令即使不相同,也应该相似。

这表明克隆和获取之间存在显着差异。这些命令有何不同?

我们正在寻找确定遥控器修复方法。

请注意,远程位于 github 企业服务器上,因此我们对远程存储库的访问受到限制。


一些额外的统计数据

$ git clone git@$REMOTE/main.git .
Initialized empty Git repository in $HOME/cloned/.git/
remote: Counting objects: 439172, done.
remote: Compressing objects: 100% (238472/238472), done.
Receiving objects: 100% (439172/439172), 13.82 GiB | 19.92 MiB/s, done.
remote: Total 439172 (delta 186192), reused 436323 (delta 183501)
Resolving deltas: 100% (186192/186192), done.
Run Code Online (Sandbox Code Playgroud)
$ git fetch
remote: Counting objects: 246663, done.
remote: Compressing objects: 100% (80057/80057), done.
remote: Total 246663 (delta 159364), reused 238800 (delta 153402)
Receiving objects: 100% (246663/246663), 1.13 GiB | 12.25 MiB/s, done.
Resolving deltas: 100% (159364/159364), done.
Run Code Online (Sandbox Code Playgroud)

这些是一些非常不同的数字。

Jam*_*mes 5

不同之处在于,git fetch只会从现有分支和源中的这些分支可访问的标签中提取所有提交。

但是, agit clone将获取所有分支和所有现有标签可到达的所有提交。这是一个微妙的差异,但最有可能导致您所看到的情况。

您可以通过git tag在两个存储库中运行来测试这一点,看看它们是否列出了不同的标签。

如果是这样,您可以git fetch --tags origin在提取的只有 1.4 gig 的存储库中执行此操作,它将拉下所有这些额外的提交。

要“修复”此问题,您可以删除克隆中显示但提取的存储库中未显示的任何标签。只要确保您确实想要丢失提交历史记录即可!git tag -d <tagname>以及git push :refs/tags/<tagname>每个不需要的标签。