我们有一个大小爆炸的远程仓库(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.
这些是一些非常不同的数字。
答案 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
的输出进行比较来验证。