我能优化Mercurial克隆吗?

10

我的Mercurial克隆变得非常缓慢,可能是由于磁盘碎片化。有没有一种方法可以进行优化?

显而易见的方法是创建一个新的克隆版本,然后将我的MQ、保存的捆绑包、hgrc等复制到新的克隆版本中,并删除旧版本。但似乎有人可能已经遇到过这个问题,并制作了一个扩展来解决它?


据我所知,Mercurial 没有任何会导致其在碎片化等方面变慢的问题。您尝试过在磁盘上运行普通的磁盘碎片整理器吗?另外,哪些操作很慢,有多慢等等? - Lasse V. Karlsen
hg qref 是一个非常慢的操作。在一个拥有大约70000个提交版本库上,可能需要50秒左右的时间。我认为这不是Mercurial特有的问题(尽管我认为Mercurial访问模式使其更加恶化),但Mac没有内置的碎片整理工具(据我所知)。 - Paul Biggar
3个回答

9
如果清单特别大,则可能会导致性能变慢。Mercurial有一种替代存储库格式 - generaldelta,它通常可以使清单更小。
您可以使用以下命令检查清单的大小: ls -lh .hg/store/*manifest*
要从generaldelta获得最大价值,请执行以下操作:
1.安装Mercurial 2.7.2或更高版本(2.7.2包括修复generaldelta中一个错误的修复程序,该错误可能导致较大的清单大小 - 但是早期版本很可能不会遇到此错误)。
2.执行hg --config format.generaldelta=1 clone --pull orig orig.gd。
这可能会在清单大小上提供一些改进,但不是全部好处。
3.执行hg --config format.generaldelta=1 clone --pull orig.gd orig.gd.gd。
克隆的克隆可能会极大地改善清单大小。这是因为当从generaldelta repo拉取时,将重新排序以优化清单大小。
例如,我最近转换了一个repo,其中包含约55000个SVN提交(使用hgsubversion进行拉取),以及约1000个Mercurial提交/合并/嫁接等。原始repo中的清单大小约为1.4GB。第一个克隆中的清单大小约为600MB。克隆的克隆中的清单大小约为30MB。
关于generaldelta的信息并不多 - 在它成为默认格式之前还有很多工作要做,但是它对许多项目都有效。前几个Google搜索结果提供了一些关于其首次引入时的信息,并且在mercurial-dev邮件列表上最近进行了一些讨论。

即使是一个较小的存储库,大约有3400个提交和一个更小的原始清单大小约为17MB,这两个克隆版本将某些hg操作缩短到原始时间的三分之一(最终清单大小为11MB)。 - J Trana

1

我删掉了仓库并重新克隆,这样就提高了性能。


这意味着你失去了所有的历史记录。这很少是一个有利的解决方案。 - Abel
Abel:为什么你会丢失所有历史记录? - Paul Biggar
抱歉,我误解了,以为你只是想要一份 Tip 的副本。我仍然不确定你如何重新克隆你删除的内容。或者你指的是保留服务器状态并创建一个新的克隆?也就是说,你只是想删除你本地的克隆?这不就和清除一样吗? - Abel
这个想法是,当你进行克隆时,它们将在磁盘上以低碎片化的方式创建(也就是说,它们将彼此相邻,这意味着访问速度会很快)。然而,当稍后添加新文件时,它们将存储在磁盘的不同部分,这将导致访问速度变慢。随着时间的推移,这将变得缓慢。通过重新开始,您可以将所有文件都放在磁盘的同一部分,使其更快(与Windows的碎片整理器类似)。 - Paul Biggar
啊,也许那应该反映在你的答案中吧。不过对我来说没什么帮助,因为我正在使用内存驱动器。 - Abel

-2

关闭实时防病毒监控所克隆到的文件夹并进行碎片整理,这就是你能做的不多了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接