你会从 cvs 迁移到 svn 还是直接迁移到 git 或 hg?

Posted

技术标签:

【中文标题】你会从 cvs 迁移到 svn 还是直接迁移到 git 或 hg?【英文标题】:Would you migrate from cvs to svn or directly to git or hg? 【发布时间】:2011-07-06 09:42:10 【问题描述】:

我不知道这是否是合适的论坛。

我的公司使用 CVS 作为版本控制系统。我们计划迁移到更现代的版本控制系统。作为风险最小的解决方案,您会推荐什么?

我的想法是使用 Subversion,但我也听到了很多关于 Git 和 Mercurial 的好消息

但是,我们是一家小公司,不需要分布式版本控制系统。除了分布式之外,Git 或 Mercurial 相对于 Subversion 有哪些优势?

【问题讨论】:

我不确定小与不“需要”DVCS 有什么关系(也不知道为什么你谈论你需要什么而不是最好的)。这里有很多关于 DVCS 优势的问题,您可能会发现这些问题很有说明性。 (事实上​​,Krtek 的回答中提到的分支和合并的便利性往往总是出现在 DVCS 中。)搜索[dvcs],你会看到很多。 请注意,他非常小心地说“尝试将它与分支 过去 一起使用”,因为 Subversion 已经解决了许多它的合并问题,并且从我所读到的今年将解决剩余的问题。 【参考方案1】:

大约 2 周前,我们在我的工作中从 CVS 迁移到 Mercurial。我们是一个6人的小团队。在迁移之前,我们中只有两个人已经使用过 CVS 以外的东西。

我负责选择新的 CVS。我考虑过 Git 和 Mercurial。

我们在 CVS 中遇到的一些问题是分支可能性很差,不支持重命名,冲突算法非常糟糕。

我从来没有考虑过 SVN,因为过去我每次尝试将它与分支一起使用时,合并总是令人头疼。坦率地说,这些天所有的炒作都是为了 dvcs,这一定是有原因的 ;)

在 Git 和 Mercurial 之间,更多的是个人选择。我爱上了 Mercurial,因为我发现它比 Git 更容易学习,而且更不以“真正的大项目”为导向。

Git / Mercurial 优于 SVN

    更好的分支和合并能力(真的是最重要的原因) 可以通过电子邮件等方式以捆绑包的形式导出/导入补丁 没有对此进行广泛的测试,但我认为 两者都比 SVN 更快(合并、克隆、差异等) 开发更加活跃,我听说SVN团队正在努力前进,但仍然如此。 非常好的扩展基础架构 附带的 Web 服务器功能,对于快速共享某些内容非常有用。

即使您说“除了它们是分布式的”,我认为这确实是一个杀手级功能。 DVCS 允许一些非常简洁的东西,一开始它可能看起来没什么用,但是一旦你用过它们,你就离不开它们;)

学习曲线

团队中有两个人对这一变化并不满意。但是用一些幻灯片对整个团队进行了两个小时的解释,一切都很顺利。

当然,他们有时会问我问题,但自迁移以来我们没有遇到任何真正的问题。只是对在工作目录中合并拉取更改的方式存在一些小误解。在几分钟内没有解决任何问题。

我想我可以说,在短短 2 周内,每个人至少都像以前一样高效,并且对新工具充满信心。现在我们可以使用特性分支而不必担心合并的到来:)

将 CVS 迁移到 mercurial

https://www.mercurial-scm.org/wiki/RepositoryConversion#CVS

官方 wiki 上列出了关于从 CVS 迁移到 Mercurial 的不同方法。我测试了Convert扩展和cvs2hg,终于用上了。

来自 CVS 的 Tailor 扩展程序 hg-cvs-import 似乎是旧代码,不再维护。

Convert 扩展在一个简单的存储库上工作得很好,但是由于我们的 CVS 存储库非常大并且有一些非常奇怪的分支,所以该扩展无法正确导入所有历史记录。 HEAD 是正确的,但缺少一些分支。

所以,最后一个选择是cvs2hg。事实上,它是 cvs2svn 的一个新后端,它转换为 Mercurial 而不是 Subersion。

自述文件中介绍的“快速入门”方法适用于所有分支。但最后我使用选项文件添加了一些用户映射并修剪了一些错误的提交或不需要的分支。

随文件提供的选项文件有很好的注释,你不难配置它以适合你。

有关信息,在初始转换后,我使用 Convert 扩展从生成的 Mercurial 存储库到另一个 Mercurial 存储库进行一些子项目提取,如 here 解释的那样。

【讨论】:

很高兴听到这个消息。是否存在将 CVS 存储库迁移到 Mercurial 的工具? 有很多方法可以做到这一点。我快速编辑我的回复,添加一些关于此的内容【参考方案2】:

编辑:很棒的链接 - http://whygitisbetterthanx.com/

================================================ ===========

是的,事实上我们刚刚从 SVN 迁移到 Mercurial。

除了分布式方面,Mercurial 和 GIT 比 SVN 快很多,而且 repo 在任何文件夹中都没有烦人的 .SVN 文件夹。更不用说合并效果更好了! yuo 还可以将您的 repo 存储在任何共享驱动器上这一事实很好(无论如何,对于 Mercurial,无需在服务器上安装东西)

更多阅读

Should I use SVN or Git?

http://www.richappsconsulting.com/blog/blog-detail/svn-vs-git-who-will-be-the-future-of-revision-control/

http://thinkvitamin.com/code/why-you-should-switch-from-subversion-to-git/

http://techblog.floorplanner.com/2008/12/09/git-vs-svn-for-bosses/

最后是 GIT 与 Mercurial

http://gitvsmercurial.com/ - 这个网站现在看起来已经死了:(

【讨论】:

哈哈,它只是最好的链接,可以阻止任何 GIT 与 Mercurial cmets。【参考方案3】:

    合并代码和解决冲突 使用分布式 VCS 更容易 像 GIT 或 Mercurial。原因 是 GIT 还是 mercurial 拥有所有 的中间快照 两个“结束代码”要合并,而 颠覆只会知道结局 快照,除非每个 SVN 用户都是 在他/她自己的分支机构工作。

    使用分布式 VCS,您不会 依赖网络检查 代码。

    如果您有大量用户 每天检查东西到 VCS 基础上,你的 SVN 服务器最好是 处理并发非常强大 签入/签出。 DVCS 没有这个问题。

我们从 CVS 切换到 SVN,现在又切换到 Mercurial,我们对过渡感到非常满意。 Mercurial 中没有任何关于 SVN 的缺失,但回到 SVN 会很痛苦。

【讨论】:

根据我的经验,颠覆不适合任何严重的合并,并且会搞砸任何不平凡的事情。不过,我不同意这个解释。 Subversion 拥有它需要的所有数据,但它的对象模型混合了分支和目录,不允许简单定义合并父级,导致在极端情况下的复杂实现带有错误。另一方面,分布式模型是基于合并的,因此在所有分布式系统中都是简单可靠的。 说 2 个开发人员在同一个分支工作。在 SVN 中,他们可能会小心地频繁签入代码,因为他们知道他们共享存储库并且不想为其他人创建提交/更新问题。当他们最终准备好签入时,您有两个需要合并在一起的代码快照,但没有代码如何到达这两个提示的历史记录。在 DCVS 中,您可能会更频繁地签入代码,因为您只知道它到您的本地存储库中并且不会为其他任何人破坏它,即当您准备合并时,您有两个历史要合并。【参考方案4】:

SVN 拥有的对您的工作流程可能很重要的东西:

    部分结账。 可以只检出树的一部分(如果您的存储库中有多个项目,这一点很重要)

    混合结帐。 结帐的部分内容可以有不同的修订版,甚至是一个文件。

    全局唯一修订单调递增。 在 SVN 中很容易看出 rev 1206 晚于 1100(cfbb0827c67d 是否晚于 d500c208c3c5?)

    许多项目可以共享同一个 SVN 存储库。 如果你的包包含几个 EXE、DLL 等等, 在 Hg/Git 领域,您最终可能会使用多个存储库来管理它。 这会使标签/修订处理有些复杂

【讨论】:

我完全同意 1 和 2。但 3 部分“错误”,至少对于 Mercurial 而言,确保每个修订版都有其唯一的哈希值,但它也有一个 local增量修订号。老实说,我不明白你的 4。 @Krtek:3 明确表示 _globally unique_——即,您可以在发布的二进制文件中发布的数字。当地的修订在这里没有减少芥末。我想 Hg 等价物会被标记。我会更新第 4 点。 是的,对不起,我跳过了全局。就像你自己说的那样,标记可能是一种解决方法,但我同意这一点。 部分签出更多的是关于不签出您不处理的大文件;如果您在 repo 中有超过 1 个项目,这意味着(至少对于 DVCS)您这样做错误 @Jakub:同意。这个答案虽然是为了给出这些东西的 svn 视图。在你的 svn repo 中有很多东西绝对是不是一个错误。【参考方案5】:

我们(诺基亚 OVI 地图)也在从 SVN 迁移到 HG。选择 HG 而不是 git 的原因是 HG 对用户更友好,与有时晦涩难懂的 git 命令相比,这些命令更有意义。同样对于 windows 用户来说,mercurial 的效果要好得多,而 tortoiseHG 也相当成熟。当我在 windows 上测试 git 时,我发现在一些简单的操作(例如检查修改)中存在严重的性能问题......

我也很喜欢你可以通过扩展使用你想要的功能。所以学习曲线比 git 更平滑,以缓存区域为例。对于来自 SVN 的人,我认为 HG 是不错的选择。

他们应该更加小心历史,例如,我们鼓励执行 hg pull --rebase 以使历史尽可能线性并仅合并分支。

【讨论】:

以上是关于你会从 cvs 迁移到 svn 还是直接迁移到 git 或 hg?的主要内容,如果未能解决你的问题,请参考以下文章

CVS 到 SVN 的迁移和分支内的分支

我可以将单个文件从 CVS 迁移到 SVN 吗?

多项目布局中的逐步 cvs2svn 迁移

cvs2svn 迁移

cvs2svn迁移后的svn合并问题

cvs2git 在哪里记录它的迁移状态?