我的公司目前使用 Subversion、CVS、Mercurial 和 git。
当我们五年前开始时,我们选择了 CVS,我们仍然在我的部门将它用于我们的主要开发和发布维护分支。然而,我们的许多开发人员单独使用 Mercurial 作为一种拥有私有检查点的方式,而无需 CVS 分支(尤其是合并它们)的痛苦,并且我们开始将 Mercurial 用于一些最多有 5 人的分支。我们很有可能在另一年最终放弃 CVS。我们对 Mercurial 的使用有机地增长了;有些人甚至从未接触过它,因为他们对 CVS 很满意。每个尝试过 Mercurial 的人最终都对它感到满意,而没有太多的学习曲线。
Mercurial 对我们来说真正有用的是我们的(自制)持续集成服务器可以监控开发人员 Mercurial 存储库以及主线。因此,人们提交到他们的存储库,让我们的持续集成服务器对其进行检查,然后发布变更集。我们支持许多平台,因此进行相当程度的手动检查是不可行的。另一个胜利是合并通常很容易,当它们困难时,您可以获得做好合并所需的信息。一旦有人让合并的版本开始工作,他们就可以推送他们的合并变更集,然后其他人就不必重复这个工作了。
最大的障碍是您需要重新连接您的开发人员和经理的大脑,以便他们摆脱单一的线性分支模型。对此最好的药是一剂 Linus Torvalds 告诉你,如果你使用集中式 SCM ,你会变得愚蠢和丑陋。好的历史可视化工具会有所帮助,但我对可用的工具还不满意。
Mercurial 和 CVS 都适用于我们使用 Windows、Linux 和 Solaris 混合的开发人员,而且我注意到时区没有问题。(真的,这并不太难;您只需在内部使用纪元秒数,我希望所有主要的 SCM 系统都能做到这一点)。
通过相当多的努力,将我们的主线 CVS 历史导入 Mercurial 是可能的。如果人们没有故意在我们的主线 CVS 历史中引入极端案例作为测试历史迁移工具的一种方式,那将会更容易。这包括将一些 Mercurial 分支合并到 CVS 历史中,因此该项目看起来就像从第一天开始就在使用。
我们的芯片设计团队选择了 Subversion。它们主要离我的办公室有八个时区,甚至在我们办公室之间的一条相当好的专用线上 SUBversion 结帐是痛苦的,但可行。集中式系统的一大优势是您可以将大型二进制文件(例如供应商版本)签入其中,而无需使所有分布式存储库变得庞大。
我们使用 git 来处理 Linux 内核。一旦原生 Windows 版本成熟,Git 会更适合我们,但我认为 Mercurial 设计如此简单和优雅,我们会坚持下去。