为什么克隆的回购比回购的10倍大?

时间:2013-12-18 00:30:54

标签: git

我们有一个大小爆炸的远程仓库(1.4G到14G)。我们正试图弄清楚为什么这个仓库的规模增加并解决问题。

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

如果我们克隆回购,克隆的回购也是14G。

git clone <remote>

如果相反,我们从远程启动和获取,本地仓库将回到预期的1.4G。

git init
git remote add origin <remote>
git fetch

我认为这两组命令应该是相似的,如果不相同的话。

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

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

请注意,远程服务器位于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.

$ 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.

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

2 个答案:

答案 0 :(得分:4)

不同之处在于git fetch只会从现有分支中提取所有提交,并且可以通过原始分支到达这些分支。

但是,git clone将获取所有分支和所有现有标记可以访问的所有提交。这是一个微妙的差异,但最有可能导致你所看到的。

您可以在两个回购邮件中运行git tag来测试这一点,看看他们是否列出了不同的代码。

如果是这样,你可以在你所获得的只有1.4 gig的仓库中做git fetch --tags origin,它会下拉所有这些额外的提交。

要“修复”此问题,您可以删除克隆中显示的所有标记,但不会删除已提取的存储库中的标记。只要确保你真的想放弃那个提交历史!每个不需要的标签都有git tag -d <tagname>git push :refs/tags/<tagname>

答案 1 :(得分:0)

克隆版本和获取版本之间的唯一区别应该是结帐。

获取的目录应仅包含.git目录,而克隆的目录也将检出工作树。

“理论上”git clone -n应与您的提取完全相同。

您的存储库中是否有一些稀疏文件或易于压缩的文件?在这种情况下,gits对象可能比工作树中的文件小得多。

您可以通过将工作树的输出与.git的输出进行比较来验证。