何时以及为什么会选择集中式(SVN)而不是分布式(Git,Mercurial)?

11
最近在我的新工作中,我们的部门(主要是建立股票和赛马网站,且我们只在办公室内处理网站)正在考虑使用 SVN 或 Mercurial。我们的项目经理表示他偏好 SVN(但没有告诉我们原因),但给予我们选择使用 Mercurial 的机会,并询问我们的意见(最终决策仍由他做出)。
鉴于大多数在线文章都是关于解释为什么选择 Mercurial 而不是 SVN(或类似的内容),我想反其道而行之。
那么在一个新项目中,即使 Mercurial/Git 比 SVN 有很多优点,你何时和为什么会选择使用 SVN 呢?

任何技术的选择都应受到您想要集成的其他技术的影响。因此,如果您有大量与Subversion集成但不与Mercurial集成的其他工具,则应选择Subversion。 - Nathan Ryan
@Nathan D. Ryan:但这不应该是唯一的标准。如果是的话,任何新技术都无法获得立足之地,因为旧技术的网络效应太强大了,难以克服。 - Omnifarious
@Omnifarious:同意。我并不是想表明这应该是唯一的标准,但从实际角度来看,这应该是一个考虑因素。就个人项目本地存储库而言,我使用Subversion;至于其他所有东西,我已经转向使用git。我认为,分布式版本控制所涉及的额外间接层使其在协作方面更加优越。 - Nathan Ryan
4个回答

11

当我被同事或管理层强制执行时,以流行观点为依据时,我最有可能使用集中式版本控制系统。这是最有可能的情况。

有一些具体情况下,我会选择Subversion或Perforce而不是Mercurial。这些与特定功能有关。例如,将随机子目录视为自己的存储库的能力在某些情况下可能很有用。Perforce在检出时重新排列目录结构的能力也可能很有用。Perforce在处理大型二进制对象方面表现出色,这些对象用于游戏开发和其他类型的媒体工作,而Mercurial和Git目前都不是特别擅长处理这些事情。

但总体来说,除非是非常特殊的情况,否则我永远不会选择非分布式版本控制系统。我认为它们极其限制和约束我的工作流程。自从我了解了版本控制以来,我就对它们感到失望。从纯工作流程的角度来看,使用集中式版本控制系统所能完成的事情,在分布式版本控制系统中也能够实现。


是的,这就是我在工作中使用SVN(而不是我总是有选择时使用的Monotone)的唯一原因......而且每次我不得不进行合并时,使用SVN都是我后悔的事情,特别是当我被迫在提交之前打破一个工作版本,只因为它不是针对head。 - lapo
1
您是本页上唯一提到svn和Perforce能做而hg和git不能的“主要”事项的人。这些才是任何明智选择集中式版本控制系统的人所必须考虑的“实际”因素。没有其他可以辩护的理由。 - Neil Traft

10

Subversion是一个非常好的集中式版本控制系统。它是成熟的,并且有很好的支持工具,比如Trac。它的“每个快照一个版本”的功能非常出色,而“分支”只是一个“轻量级副本”。实际上,在遗留版本控制的背景下,使用更“脆弱”的语义(例如每个文件的版本号和它们自己的特殊性),Subversion非常出色。(我已经用了多年。)

话虽如此,我正在转向Mercurial。(我会考虑Git,但目前在Windows上Mercurial更成熟。)Tortoise-Hg远没有Tortoise-SVN成熟。然而,Mercurial和Git都是为合并而构建的。这是版本控制系统的根本问题。

使用Mercurial时,每个仓库都有所有内容。合并很简单。仓库本身就是一个“沙盒”,因此您无需具备“主干”和“分支”的“千里眼”,以及进行其他分支前规划。简言之,即使开发人员集中在一个命令结构中(滚动到“最终批准的Trunk”分支),开发团队也是通过分布式仓库来工作的。

摘要:Subversion是一个很好的模型,但非常集中。它是成熟的,具有成熟的工具,并与其他工具(如Trac)成熟地集成。Mercurial(和Git)是更好的模型,但提供与Subversion相同的“每个仓库快照只有一个版本”。工具(如Tortoise-Hg)不够成熟(与Trac的集成需要更多的工作),并且您在使用Mercurial时会略微不同思考(例如,分布式仓库是同步的),这提供了一些优势,但您应该真正以不同的方式来考虑问题(比使用Subversion时)。

我每天都使用两者。它们都很棒。当我们以更成熟的方式将Mercurial与Trac集成时,我会完全转向Mercurial。(不那么成熟的Tortoise-Hg不如Tortoise-Svn好,但我可以接受它。)

完全迁移到仅使用Mercurial可能需要一段时间(比如一两年的时间,因为Trac提供更好的本地Mercurial集成)。Mercurial和Subversion之间的导入/导出并不困难。在我们现有的代码库中,我们同时使用两者:中央“主干”是Subversion,并且本地更改存储在Mercurial中,最终回检入到Subversion中。它运行良好。
如果要与其他工具配合使用,请检查其与Subversion和Mercurial的接口。如果所有东西都相等,请选择Mercurial。否则,您不能选择Subversion(我们特别之所以使用Subversion是因为Trac的支持),也可以在其上使用Mercurial(我们也这样做)。
最后,在您提出问题的背景下:
当在新项目中需要在Mercurial/Git和SVN之间进行选择时,面临许多Mercurial/Git对SVN的优势时,为何会选择SVN?
我会选择SVN而不是Mercurial,因为:
  1. 与其他工具(如Trac)的集成更加成熟,我们使用这些其他工具;
  2. 实用接口(如Tortoise-Svn)比Mercurial前端(如Tortoise-Hg)更成熟;
  3. Subversion在概念上是一个非常简单的模型(例如,单版本快照),而集中式存储库是人们历史上用于思考版本控制的方式(分布式Git/Mercurial模型需要不同的思考方式);
  4. 我们有一个可靠的流程来规划“主干”和“分支”,并且不需要显著的工具支持来帮助完成那些痛苦的跨分支合并。

2
一个词:TortoiseSVN。对我来说,TortoiseSVN是所有版本控制系统(GUI clients)的标准。尽管在分布式版本控制系统(DVCS)面前SVN存在缺点,但TortoiseSVN使得使用SVN变得轻松。TortoiseGit也很不错,模仿了TortoiseSVN,但TortoiseHg就不怎么样了。
另一个原因是出色的系统管理员支持。在SVN方面,这些工具都经过了充分开发和成熟。Git和Hg仍有待赶上。
您还可以查看我的答案,链接如下:which version control is best suited for me? 还有这个非常类似的问题:https://stackoverflow.com/questions/2693045/mercurial-vs-subversion

2
TortoiseHg最近发布了2.0.X版本,相较于v1.X.X版本,它增加了多项改进和新功能。如果你因为Tortoise而不使用Hg,那么你应该试试它。 - dls

0

当Mercurial的优点不是你会使用或适用于你的情况时。


1
这种方法的问题在于,你会使未来获得这些优势变得非常困难。你在一开始就自我限制了。 - Omnifarious

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