有谁知道有很多分支(2000+)的git仓库的影响是什么?由于拥有那么多分支,git pull或git fetch是否会变慢?如果存在差异,请提供基准。
答案 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年第二季度)。
refspec见commit 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,其中包含的信息可能有助于您更好地了解如何处理分支。