git repo中大量分支的影响?

时间:2015-03-04 08:04:17

标签: git

有谁知道有很多分支(2000+)的git仓库的影响是什么?由于拥有那么多分支,git pull或git fetch是否会变慢?如果存在差异,请提供基准。

4 个答案:

答案 0 :(得分:16)

正如其他人所指出的那样,分支和其他引用只是文件系统中的文件(因为packed refs而不是很正确)并且非常便宜,但这并不意味着它们的数量不能影响表现。参见例如Git邮件列表中的Poor push performance with large number of refs线程,最近(2014年12月)Git性能的例子受到存储库中20k refs的影响。

如果我没记错的话,几年前ref处理的某些部分是O(n²),但从那时起就可以很好地修复。有一个repo-discuss thread from March 2012包含一些可能有用的细节,如果可能是日期和JGit特有的。

同样有点过时的Scaling Gerrit文章讨论了(其中包括)高参考值的潜在问题,但也注意到有几个网站的gits超过100k refs。我们有一个约150k refs的git,我认为我们没有看到任何性能问题。

拥有大量引用的一个方面是在一些Git事务开始时ref引用的大小。上述150k ref git的广告大小约为10 MB,即每个git fetch操作将下载该数据量。

所以是的,不要完全忽略这个问题,但你不应该仅仅因为2000 refs而失去任何睡眠。

答案 1 :(得分:4)

2015年3月:我没有基准但只有一种方法可以确保git fetch仍然合理,即使上游回购有大量分支也是特定的一般性 {{3} } 比默认情况下的那个。

fetch = +refs/heads/*:refs/remotes/origin/*

您可以根据需要向远程添加任意数量的fetch refspec,有效地将上面的catch-all refspec替换为更具体的规范,只包含您实际需要的分支(即使远程仓库有数千个)

fetch = +refs/heads/master:refs/remotes/origin/master
fetch = +refs/heads/br*:refs/remotes/origin/br*
fetch = +refs/heads/mybranch:refs/remotes/origin/mybranch
....

2018年4月:git fetch将改进Git 2.18(2018年第二季度)。

refspeccommit 024aa46(2018年3月14日) Takuto Ikuta (atetubou)合并于Junio C Hamano -- gitster --,2018年4月9日)

  

fetch-pack.c:使用oidset检查松散对象的存在

     

从具有大量引用的存储库中获取时,因为   检查本地存储库中每个refs的存在是否已打包并松散   对象,'git fetch'最终会为不存在的事件做很多lstat(2)   松散的形式,这使它变得缓慢。

     

而不是像远程端的refs那样进行尽可能多的lstat(2)次调用   为了看这些对象是否以松散的形式存在,首先要做广告   预先枚举hashmap中所有现有的松散对象并使用   如果refs的数量大于,则检查它们的存在   松散物体的数量。

     

使用此修补程序,lstat(2)git fetch次呼叫的数量会减少   从储存库的411412到13794,它有超过480000   远程参考。

     

当获取铬的fetch-pack时,我花了git fetch的时间统计数据   使用SSD在Linux上存储3次。

* with this patch
8.105s
8.309s
7.640s
avg: 8.018s

* master
12.287s
11.175s
12.227s
avg: 11.896s
  

在我的MacBook Air上有更慢的lstat(2)。

* with this patch
14.501s

* master
1m16.027s
  慢速磁盘上的

git fetch将大大改善。

答案 2 :(得分:4)

是的,确实如此。在本地,这不是一个问题 - 虽然它仍然会影响几个本地命令。特别是,当您尝试根据可用的refs描述提交时。

通过网络,当你连接到它进行更新时,Git会做一个初始的ref广告。您可以在pack protocol文档中了解相关信息。这里的问题是您的网络连接可能是片状或潜在的,并且初始广告可能需要一段时间。已经讨论过删除此要求,但是,与往常一样,兼容性问题使其变得复杂。关于它的最新讨论是here

您可能还想查看最近有关Git scaling的讨论。你有很多方法可以让Git扩展,到目前为止它已经讨论了大部分。我认为它让你很好地了解Git擅长什么,以及它可以使用一些工作。我会为你总结一下,但我认为我不能做到公道。那里有很多有用的信息。

答案 3 :(得分:3)

为了回答你的问题,你应该知道Git如何处理分支。什么是分支?

分支只是提交本地仓库的引用,创建分支非常便宜。 .git目录包含包含git使用的元数据的目录,当您创建分支时,会发生的是向本地分支创建引用并创建历史记录日志。换句话说,创建分支是创建文件和引用,系统可以轻松处理2000个文件。

我建议您浏览3.1 Git Branching - Branches in a Nutshell,其中包含的信息可能有助于您更好地了解如何处理分支。