本地服务器使用SVN、GIT或Mercurial哪一个?

4
我希望在我们的本地服务器上安装一个版本控制系统。我已经看过了SVN、GIT和Mercurial的优缺点。
我们目前大约有30-35个不同的网站。我应该创建一个包含所有网站文件夹的仓库吗?还是将它们作为单独的网站项目处理更好?GIT或SVN哪个更好?
我还需要在我们的Linux服务器上安装它,并为开发人员创建开发sandbox。参与的人也使用Windows和MAC。
我只是想从经验中获得建议,以及有关如何在本地服务器上安装它们的指导链接。
至于应用程序,我认为TourtiousGIT/SVN在Windows上很好用,而Tower和Versions在MAC上很好用。
6个回答

5
让我们进行一次平衡的比较,基于这样一个前提,即在您的情况下,您可能不需要任何高级功能。
比较:
存储:
1.文件系统布局:SVN需要两个东西,一个工作目录和一个仓库,以便处理您的数据。这不仅会导致元数据不必要的重复,而且使事情稍微更加难以处理。Git和Mercurial都可以将完整的历史记录保存在工作目录中(每个工作目录都是完整的仓库)。如果您不打算在服务器上检查文件的副本,则这并不太相关(但它比那更复杂,因此请记住,在其他情况下,这整个项目符号可能根本不适用)。
2.工作目录混乱:SVN在您的存储库的每个子目录中添加了“.svn”子目录;Git和Mercurial只在顶层添加了单个“.git” / “.hg”目录。
3.空间消耗:Git和Mercurial使用的存储机制往往比SVN的效率高得多。 Git的缺点是必须定期优化存储库(如果您没有非常大的文件,则通常很快);我不知道Mercurial是否需要这样做,但我怀疑它不需要。
结论:我推荐Git或Mercurial。
功能:
由于您可能甚至不需要Git / Mercurial更好的合并功能,因此我不认为这是决定性因素。如果您计划同时处理多组更改,则情况就不同了;在那种情况下,Git / Mercurial可能会让您的工作更加轻松。
速度:
Git和Mercurial比SVN快得多,特别是因为它们的设计允许在本地执行许多操作。
1.查看旧内容:在SVN中查看更改历史意味着SVN必须连接到远程存储库并查看那里;在(例如)Git中,通常在SVN建立该连接之前就会显示历史记录。
2.依赖操作系统:Git的许多优化仅适用于Linux;在Windows上,您可能会遇到更差的性能。其他竞争对手可能也存在相同的问题,但程度较轻,我不知道。
3.传输:在几乎任何情况下,Git和Mercurial比SVN更快地发送和接收新更改。
结论:如果您喜欢快速处理事务,则应选择Git和Mercurial。在Windows上,Mercurial可能是更好的选择,但如果您想确保,请参考/执行实际基准测试。
DVCS:
Git和Mercurial允许开发人员继续处理他们的事情,并将它们组织成一组合理的提交,即使他们当前没有连接到您的网络。在SVN中,提交只能在它们同时出现在服务器上时进行,因此SVN用户倾向于使用更加庞大(因此更难理解)的提交。至少Git甚至有一个工具可以快速查找引入错误的提交,使用二进制搜索。同样,SVN在这里可能不如其他工具。
复杂性
我非常喜欢Git,我很容易同意Git不是最用户友好的版本控制系统,至少如果您不了解其设计的话。对于更高级的用例,我认为工具链可以弥补这一点;在您的情况下,除非您期望将来使用相同的VCS进行更复杂的项目,否则您可能更喜欢Mercurial或SVN。
工具、界面
我不太了解Mercurial,所以我对它存在哪些接口不是很熟悉。实际上,我也不使用任何花哨的Git接口,但我相信所有竞争者都有足够的工具允许基本使用,即针对不喜欢命令行的人。但是,在向团队介绍任何特定内容之前,我强烈建议您进行一些小测试。
您的问题
不同系统的存储库结构往往不同。在SVN中,可以在同一个存储库中拥有大量项目;Git和Mercurial强烈建议每个项目使用一个存储库。对于共享代码,Git至少有三个工具(其中两个是第三方)用于使用外部存储库,Mercurial可能也有类似的工具。我知道SVN也有这样的东西。
如果您将它们作为单独的存储库管理,那么我可能会推荐Git或Mercurial,因为正如前面所说,它们 tend to have less overhead per repository.
在服务器上安装Git / Mercurial / SVN可能很容易,如果您使用任何较大的Linux发行版,则几乎肯定有现成的软件包可用。如果您预计需要管理具有不同每用户访问控制的多个存储库,则有一个名为gitolite的Git管理系统非常好用。没有像这样的东西,管理多个存储库可能有点麻烦。

我不确定它是否太平衡..例如,你说git比SVN更节省空间,然后你又描述了它有多么快。当然,这是因为整个仓库都保存在本地——所以从技术上讲,你需要比svn本地多得多的空间来存储git,所以它在存储方面并不真正比svn更好。(并不是批评,只是不同)(而且你从未谈到git中的二进制文件——它们的空间利用率并不高)。 - gbjbaanb
实际上,对于许多大小适中的代码库来说,Git 仓库比 SVN 工作副本更小。在 Git 中,二进制文件是增量压缩的(在 git gc 过程中),并且与 SVN 不同,这些增量甚至可以重用其他文件中的内容。 - Jan Krüger

2
我建议不要使用SVN,因为在我看来,DVCS的分支和合并能力几乎是必不可少的。我从未使用过hg,但我会推荐使用git。如果想学习git,请先阅读这里的前几章节。 http://progit.org/book/ 设置好后,我建议为每个站点设置一个不同的repo,并使用git的开发分支,当你准备好发布时,将其合并到主分支上。了解一下gitflow,更多关于使用git的工作流程。 http://nvie.com/posts/a-successful-git-branching-model/ 这是一篇关于工作流程的文章,其中有一个链接可以安装git扩展。还有一些视频教程可以学习。
如果你是更喜欢视觉学习的人,也可以查看tekpub的git系列。 http://tekpub.com/productions/git 祝你好运。

也许你应该试试Hg,这个家伙给出了比git更好的理由:http://jhw.dreamwidth.org/1868.html(很抱歉煽风点火 :)) - gbjbaanb
我最终会尝试一下。这在我的待办列表上。我实际上有一段时间看到了一个类似的帖子并浏览了一下。我也会准备好那个。我真的很好奇它们之间的相似和不同之处。 - Buddy Lindsey

2
如果你只是在本地开发(也就是在你的网络内,而不仅仅是在一台机器上),那么SVN可能是最好的解决方案。即使你有几个分布式开发者,如果他们只需要连接到一个中央仓库并检查文件进出,则SVN是一个很好的工具。当然,SVN也有自己的怪癖和陷阱。
GIT增加了大量复杂性,因为它们倾向于重新定义常用工作流程甚至常见版本控制系统术语的含义,并且该工具在过程中添加了额外的步骤(将本地存储库与服务器同步)。SVN具有更成熟的IDE集成,工具运行更加平稳。TortoiseGIT还不是非常成熟。
如果你决定以后想要转移到GIT,那么有很多工具可以将SVN导入GIT,因此不会丢失任何工作。
GIT旨在允许许多不同的人独立工作,然后合并和同步他们的更改。如果您不需要这样做,请使用SVN。
GIT比SVN具有许多优点,但SVN也有其优点。例如,SVN使用差异,而GIT使用快照。这意味着GIT存储库可以比其中包含相同数据的SVN存储库大得多。基本上,GIT完整地存储了文件的每个更改副本,而SVN仅存储增量。在存储数据的类型方面,这可能是重要的。

1
绝对不是这样的。由于缺乏git的pack文件,Svn存储库要大得多。我迁移的一个存储库在转换为git后缩小了10倍。Svn的缺点是合并非常愚蠢。这限制了您在分支每个功能上的有效性。永远不要向任何人推荐svn。现在我已经使用了这两种工具多年,当我读到这种肤浅和错误的评估时,我感到震惊。 - Adam Dymitruk
@adymitruk - 你只是在谈论文本文件。并不是所有存储在版本控制中的文件都是文本。大型二进制文件的压缩效果比存储二进制差异要差很多。 - Erik Funkenbusch
@adymitruk - 关于SVN的合并,是的它不完美,但大多数人真的不需要GIT的高级合并功能。这就像这样,GIT具有高级合并功能,因为它需要支持GIT的分布式特性。如果您不需要分布式功能,则合并要求往往会降低。 - Erik Funkenbusch
1
@adymitruk - 此外,SVN 只需要下载文件的当前版本,而 git clone 则需要下载整个仓库。这可能意味着开始编写代码的时间差异为 20 分钟和 20 小时。 - Erik Funkenbusch
@adymitruk - 我的经验与众不同。我发现 Git 克隆一个仓库需要的时间比从一个类似大小的 SVN 项目进行 tip checkout 长 3-10 倍不等,特别是在你使用较慢的 DSL 连接时。而且是一次性的 (就像 svn checkout 一样)。SVN 只需下载最新版本,Git 必须下载整个存储库,对于大型存储库来说这可能非常痛苦。并且,你还忽略了大型二进制文件的情况。 - Erik Funkenbusch
显示剩余3条评论

0

Svn和git的争论已经进入了圣战的领域,因此它们并不是一个合适的话题,更何况这个问题经常有重复。你的分支模型问题则更容易得到客观答案。以下是一些通用的指导原则:

  • 在网站之间共用的代码应该从一个官方仓库中获取。如果你发现自己需要在源代码控制之外进行相同的更改传播,比如在文件夹之间复制和粘贴文件,那么它就没有正确设置。
  • 为不同网站定制的代码应该理想地被架构在与公共代码分开的目录中。这使得公共代码和自定义代码相对独立,可以使用git子模块或svn部分检出来组装配置。
  • 如果由于历史原因无法分离架构,则可以维护每个单独网站的自定义分支。然而,每当您对公共代码进行更改以便传播到所有站点时,您就会面临更高的合并冲突风险,必须手动解决。您还必须小心选择在哪个分支上进行公共代码更改。请注意,合并冲突的可能性并不是完全放弃源代码控制分支的好借口。您的架构意味着这些冲突仍然会发生,所以最好让您的源代码控制帮助您完成合并。这样,您只需要担心真正的冲突。

不是圣战。只是一群不需要改变的人坚持不采用更好的工具。 - Adam Dymitruk
@adymitruk:仅仅因为你喜欢Git并不意味着它是唯一可能的解决方案。请停止使用相同的无建设性评论进行恶意攻击。 - gbjbaanb

-1
首先,据我所知,SVN是唯一允许您将所有站点存储在单个仓库中并选择性地单独检出它们的版本控制系统(请参见稀疏检出)。
其次需要注意的是,在Windows上使用git支持并不像大多数Windows用户习惯的那样顺畅,而且我认为TortoiseGit还没有完全准备好。Mercurial可能是Windows DVCS的更好选择。
我认为你需要做的事情是坐下来,了解你的团队使用的工作流程 - 你有多少合并,有多少并行开发,你的主要仓库用作明确的源有多少,你有多少离线工作等等。如果您不执行DVCS擅长的任何操作,则SVN可能是更好的选择 - 更好的工具和更简单易懂的用法。如果您执行了SVN不擅长的某些操作(离线工作,大量重构),那么我可能会选择Mercurial。

糟糕的评估。可怜的家伙。如果他按照你的建议去做,他将处于劣势。速度呢?Git就像一辆法拉利。考虑到他管理着这么多网站,Git显然是最佳选择。 - Adam Dymitruk
1
@adymitruk - GIT并不是明显的胜者,因为你真的不知道他的要求是什么。例如,如果您需要在多个站点上更新相同的文件..GIT会让这成为一件非常麻烦的事情,因为每个站点都是自己的存储库。GIT在某些领域有很多限制。也许这些不会影响您,但这并不意味着因为它符合您的要求,就适用于所有人。 - Erik Funkenbusch
有哪些限制?我两种都用过 - 先是2年以上的SVN,然后是2年以上的git。与git相比,SVN绝对是一团糟。我有过很多项目与他所做的非常相似。 - Adam Dymitruk
@adymitruk - 你如何使用git在多个仓库之间共享文件甚至整个子文件夹?也就是说,如果你在其中一个仓库中进行了更改,它会在所有仓库中更新?这种情况的一个常见例子可能是企业品牌(图像、图标、布局等)。 - Erik Funkenbusch
我有一个12GB的代码库需要管理,当每个人都有本地副本时,使用Git可能不太高效。分布式版本控制系统有其优点,但这并不意味着它是万能的解决方案。需要考虑二进制存储、rebase与merge之间的问题、在子模块中使用公共代码、缺乏向前推进的修订号以及糟糕的用户界面(这可能是非技术用户的最终问题)。 - gbjbaanb

-4

Git是您最好的选择。您可能需要更多的学习曲线,但最终您将变得更加高效。


我自己是一个Git用户,但我有很多朋友是Hg用户。从我和他们的交谈中,我觉得Hg基本上具有与Git相同的功能集。现在的问题是:为什么你会推荐Git而不是Hg? - joce
7
“使用Git”或“使用Mercurial”的问题在于,大部分时间,建议应该只是“使用分布式版本控制系统”,其余的都是意见,除非提问者要求具体功能上DVCS能否完成。个人推荐Mercurial,但这不是一个答案,只是一个意见。 - Lasse V. Karlsen
3
如果在Subversion和Git之间做出选择,选择Git! - Lasse V. Karlsen
在hg中,重定基和其他git功能只是事后想法。这样会限制自己。不要点踩。这是正确的答案。 - Adam Dymitruk
Git的采用率更高。Rerere。Rebasing并不是一个后来的想法。你不仅限于使用Python进行扩展,包括钩子等。速度快,GitHub、Gerrit用于代码审查。清单还在继续。 - Adam Dymitruk
SVN的支持者应该得到他们所得到的 :) 一条鱼不知道它在水里... - Adam Dymitruk

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