Git和Mercurial - 有人可以解释这个测试结果

时间:2010-10-20 22:57:26

标签: git mercurial

我正在对GIT和Mercurial的速度进行比较 我选择了一个9072文件的大项目(主要是php文件和几个图像),大小为95.1 MB。

这是一个假项目,可能会让某人知道如何解释我得到的结果 - 这是一个wordpress下载,未更改,并在两个文件夹中复制了12次 - 一个用于GIT,另一个用于Mercurial存储库

然后我创建一个GIT存储库并提交(使用TortoiseGIT),完成后,我在使用TortoiseHG的Mercurial的另一个文件夹上做了同样的事情。

Git结果
时间:32分30秒即可完成任务 存储库大小:6.38MB,只有847个文件。

Mercurial结果:
时间:1分25秒 - 是的,仅1分钟 存储库大小:58.8MB,包含9087个文件。

我不是在讨论最好的或者其他什么,我只是想了解差异以及SCM如何创建存储库。

看起来HG做了一些文件的副本,并进行了某种压缩 但我不明白Git做了什么 有人能解释一下结果吗?

PS:我知道GIT和Mercurial已经存在一些问题,我只想弄清楚这个测试的结果 - 即使它是一个有效的测试。当我开始时,我只是检查速度,但最终我的头顶上有一些问号......

3 个答案:

答案 0 :(得分:18)

检查您的工具; hg和git(命令行)都导入这些 大约一秒钟的树木。考虑这些工具的命令行版本 优先于GUI包装器。

你遇到的情况是git擅长而且hg更少 高效。 Mercurial使用单独的文件作为每个文件的revlog, 而git喜欢让事情更加统一。特别是,复制 相同的目录十二次在git中几乎没有额外的空间。但 这种情况多久发生一次?我希望不是很好。如果你经常进口 成千上万的文件和图像,而不仅仅是初始提交, DVCS可能不适合您。像rsync或者一样的东西 集中式VCS会更好 - DVCS通常针对a进行调整 保存文本文件并接收补丁和合并的单个项目 随着时间的推移。其他类型的工具会有不同的权衡。

导入大型目录树真的没什么意义 并仔细检查出现的文件;你可以看看 文档,如果你喜欢。这里的主要教训是git保持不变 整个目录结构的快照,允许它 有效地打包东西(wordpress的捆绑包是2.7MB,没有 大于tarball),但计算差异可能更昂贵。 Mercurial维护了更多的每个文件信息,如日志和差异, 这意味着只访问一个文件的日志比快 在git中,但许多相同的文件和目录可以有更高的 空间成本。

我也可以创造一个病态案例。这是git获胜的地方:

for dir in {1..100}; do
  mkdir $dir
  for file in {1..100}; do
    touch $dir/$file
  done
done
hg add {1..100}; hg commit -m tweedledee
git add {1..100}; git commit -m tweedledum

是的,这是100个相同目录中的10,000个空文件。混帐 在十分之一秒内导入整个事物,并提交本身 不到一千字节。 Mercurial,为每个创建一个日志文件 文件,大约需要四秒钟才能提交整个文件,最终结束 使用.hg中的10140个新文件,总计40MB。

这是mercurial获胜的地方:

mkdir -p a/b/c/d/e
for i in {1..1000}; do
  echo hello >> a/b/c/d/e/file
  hg add a; hg commit -m "Commit $i"
  git add a; git commit -m "Commit $i"
done

这是一千个提交,每个提交一个微小的变化 一个深层嵌套的文件。 git中的每个提交都引入了8个新提交 对象,它们单独放气但存储为单独的 文件。最终,git决定重新打包,这需要时间。解压后, 整件事大概是32MB,打包了620K。 Mercurial,关于 另一方面,每次只需将几个注释添加到几个日志文件中,并且 最后.hg是396K。

这一切有什么意义?关键是没有一个案例 在这个线程中讨论是现实的。在日常使用中,随着 现实的存储库,这两个工具都很棒。只学一个。

手册本身并不能完全显示构建提交的方式,但Git Internals in Pro GitInternals in the Mercurial wikiMercurial Internals from PyCon 2010应该可以帮助您入门。

答案 1 :(得分:2)

我建议你比较DVCS的功能和工作流程,而不是速度和磁盘空间。磁盘空间相当便宜,Git和Mercurial都非常有效。至于速度,即使对于非常大的项目,也不会让你失望。寻找与您使用(或想要使用)工作流程相符的功能和功能。

至于你的例子中存储空间的差异,git不会跟踪单个文件,因此它会注意到内容被重复并且效率更高(同时花费更多时间)......但是,这种情况多久发生一次现实生活?

我建议你也阅读mpe的链接帖子/文章。 :d

答案 2 :(得分:1)

这听起来不是一个非常好的测试,即。通常情况下,您承诺没有历史记录的项目和相同内容的12个相同副本。

What is the Difference Between Mercurial and Git?

Git and Mercurial - Compare and Contrast

http://www.wikivs.com/wiki/Git_vs_Mercurial