我已经将Mercurial用于我自己的个人项目一段时间了,我喜欢它.我的雇主正在考虑从CVS转换到SVN,但我想知道是否应该推动Mercurial(或其他一些DVCS).
Mercurial的一个问题是它似乎是围绕每个"项目"拥有一个存储库的想法而设计的.在此组织中,当前CVS存储库中有许多不同的可执行文件,DLL和其他组件,这些组件按层次结构组织.有许多通用的可重用组件,但也有一些客户特定的组件和客户特定的配置.当前的构建过程通常从CVS存储库中获取一些子树.
如果我们从CVS迁移到Mercurial,那么组织存储库/存储库的最佳方法是什么?我们应该有一个包含所有内容的巨大Mercurial存储库吗?如果不是,那么较小的存储库应该有多细粒度?我认为如果他们必须从许多不同的地方提取和推送更新,人们会觉得非常讨厌,但如果他们必须拉/推整个公司的代码库,他们也会觉得很烦人.
有人有这方面的经验或建议吗?
相关问题:
企业中基于Git的源代码控制:建议的工具和实践?
大型项目的分布式版本控制 - 可行吗?
Johannes Rud.. 55
披露:这是另一个专注于git的线程的交叉帖子,但我最后还是推荐了mercurial.它在一般的企业环境中处理DVCS,所以我希望交叉发布它很好.我已经修改了一点以更好地适应这个问题:
反对普遍看法,我认为使用DVCS是企业环境中的理想选择,因为它可以实现非常灵活的工作流程.我将首先讨论使用DVCS与CVCS,最佳实践,然后特别是关于git.
企业环境中的DVCS与CVCS:
我不会在这里讨论一般的利弊,而是关注你的背景.通常的概念是,使用DVCS需要比使用集中式系统更有纪律的团队.这是因为集中式系统为您提供了一种简单的方法来强制执行您的工作流程,使用分散式系统需要更多的沟通和纪律,以坚持既定的惯例.虽然这看起来似乎会导致开销,但我认为增加沟通的好处是使其成为一个好的过程.您的团队需要就一般的代码,变更和项目状态进行沟通.
纪律背景下的另一个方面是鼓励分支和实验.以下是Martin Fowlers最近关于版本控制工具的 bliki条目的引用,他已经找到了这种现象的非常简洁的描述.
DVCS鼓励快速分支进行实验.你可以在Subversion中做分支,但是所有人都可以看到它们不鼓励人们为实验工作开辟一个分支.类似地,DVCS鼓励检查工作:将未完成的更改(甚至可能无法编译或通过测试)提交到本地存储库.你可以在Subversion的开发者分支上做到这一点,但是这样的分支在共享空间中的事实使得人们不太可能这样做.
DVCS支持灵活的工作流程,因为它们通过有向无环图(DAG)中的全局唯一标识符而不是简单的文本差异来提供变更集跟踪.这允许他们透明地跟踪变更集的来源和历史,这可能非常重要.
工作流程:
Larry Osterman(一个致力于Windows团队的微软开发人员)有一篇关于他们在Windows团队中使用的工作流程的博客文章.最值得注意的是他们有:
一个干净,高品质的代码主干(主回购)
所有开发都发生在功能分支上
功能团队有团队回购
他们会定期将最新的主干更改合并到其功能分支中(Forward Integrate)
完整的功能必须通过几个质量门,例如审查,测试覆盖,问答(自己的回购)
如果某个功能已完成且质量可接受,则会将其合并到主干中(反向集成)
正如您所看到的,让每个存储库都可以独立存在,您可以将不同的团队分开,以不同的速度前进.此外,实现灵活质量门系统的可能性将DVCS与CVCS区分开来.您也可以在此级别解决您的权限问题.只允许少数人访问主仓库.对于层次结构的每个级别,请使用具有相应访问策略的单独仓库.实际上,这种方法在团队层面上可以非常灵活.您应该让每个团队决定他们是否希望在他们自己之间分享他们的团队回购,或者他们是否想要更加层次化的方法,只有团队负责人可以承诺团队回购.
(图片是从Joel Spolsky的hginit.com上偷来的.)
有一点需要说明的是,尽管DVCS提供了很好的合并功能,但这绝不是使用连续集成的替代品.即使在那时你也有很大的灵活性:主干回购的CI,团队回购的CI,Q&A回购等.
Mercurial在企业环境中:
我不想在这里开始使用git vs. hg flamewar,考虑到切换到DVCS,你已经走在了正确的轨道上.以下是使用Mercurial而不是git的几个原因:
支持运行python的所有平台
所有主要平台上的优秀GUI工具(win/linux/OS X),一流的合并/ vdiff工具集成
非常一致的界面,轻松过渡svn用户
可以做git也可以做的大部分事情,但提供更清晰的抽象.危险的操作总是明确的.通过必须明确启用的扩展提供高级功能.
selenic 提供商业支持.
简而言之,在企业中使用DVCS时,我认为选择引入摩擦最小的工具非常重要.为了使转变成功,考虑开发人员之间不同的技能(关于VCS)尤为重要.
最后我想指出一些资源.Joel Spolsky最近写了一篇文章,挫败了针对DVCS提出的许多论点.必须提到的是其他人早就发现了这些反对意见.另一个很好的资源是Eric Sinks博客,他写了一篇关于企业DVCS障碍的文章.
披露:这是另一个专注于git的线程的交叉帖子,但我最后还是推荐了mercurial.它在一般的企业环境中处理DVCS,所以我希望交叉发布它很好.我已经修改了一点以更好地适应这个问题:
反对普遍看法,我认为使用DVCS是企业环境中的理想选择,因为它可以实现非常灵活的工作流程.我将首先讨论使用DVCS与CVCS,最佳实践,然后特别是关于git.
企业环境中的DVCS与CVCS:
我不会在这里讨论一般的利弊,而是关注你的背景.通常的概念是,使用DVCS需要比使用集中式系统更有纪律的团队.这是因为集中式系统为您提供了一种简单的方法来强制执行您的工作流程,使用分散式系统需要更多的沟通和纪律,以坚持既定的惯例.虽然这看起来似乎会导致开销,但我认为增加沟通的好处是使其成为一个好的过程.您的团队需要就一般的代码,变更和项目状态进行沟通.
纪律背景下的另一个方面是鼓励分支和实验.以下是Martin Fowlers最近关于版本控制工具的 bliki条目的引用,他已经找到了这种现象的非常简洁的描述.
DVCS鼓励快速分支进行实验.你可以在Subversion中做分支,但是所有人都可以看到它们不鼓励人们为实验工作开辟一个分支.类似地,DVCS鼓励检查工作:将未完成的更改(甚至可能无法编译或通过测试)提交到本地存储库.你可以在Subversion的开发者分支上做到这一点,但是这样的分支在共享空间中的事实使得人们不太可能这样做.
DVCS支持灵活的工作流程,因为它们通过有向无环图(DAG)中的全局唯一标识符而不是简单的文本差异来提供变更集跟踪.这允许他们透明地跟踪变更集的来源和历史,这可能非常重要.
工作流程:
Larry Osterman(一个致力于Windows团队的微软开发人员)有一篇关于他们在Windows团队中使用的工作流程的博客文章.最值得注意的是他们有:
一个干净,高品质的代码主干(主回购)
所有开发都发生在功能分支上
功能团队有团队回购
他们会定期将最新的主干更改合并到其功能分支中(Forward Integrate)
完整的功能必须通过几个质量门,例如审查,测试覆盖,问答(自己的回购)
如果某个功能已完成且质量可接受,则会将其合并到主干中(反向集成)
正如您所看到的,让每个存储库都可以独立存在,您可以将不同的团队分开,以不同的速度前进.此外,实现灵活质量门系统的可能性将DVCS与CVCS区分开来.您也可以在此级别解决您的权限问题.只允许少数人访问主仓库.对于层次结构的每个级别,请使用具有相应访问策略的单独仓库.实际上,这种方法在团队层面上可以非常灵活.您应该让每个团队决定他们是否希望在他们自己之间分享他们的团队回购,或者他们是否想要更加层次化的方法,只有团队负责人可以承诺团队回购.
(图片是从Joel Spolsky的hginit.com上偷来的.)
有一点需要说明的是,尽管DVCS提供了很好的合并功能,但这绝不是使用连续集成的替代品.即使在那时你也有很大的灵活性:主干回购的CI,团队回购的CI,Q&A回购等.
Mercurial在企业环境中:
我不想在这里开始使用git vs. hg flamewar,考虑到切换到DVCS,你已经走在了正确的轨道上.以下是使用Mercurial而不是git的几个原因:
支持运行python的所有平台
所有主要平台上的优秀GUI工具(win/linux/OS X),一流的合并/ vdiff工具集成
非常一致的界面,轻松过渡svn用户
可以做git也可以做的大部分事情,但提供更清晰的抽象.危险的操作总是明确的.通过必须明确启用的扩展提供高级功能.
selenic 提供商业支持.
简而言之,在企业中使用DVCS时,我认为选择引入摩擦最小的工具非常重要.为了使转变成功,考虑开发人员之间不同的技能(关于VCS)尤为重要.
最后我想指出一些资源.Joel Spolsky最近写了一篇文章,挫败了针对DVCS提出的许多论点.必须提到的是其他人早就发现了这些反对意见.另一个很好的资源是Eric Sinks博客,他写了一篇关于企业DVCS障碍的文章.
AFAICS对任何DVCS的大部分抵抗来自于不了解如何使用它们的人.对于那些自古以来就被锁定在CVS/SVN模型中并且无法想象其他任何东西的人来说,经常重复的声明"没有中央存储库"是非常可怕的,特别是对于管理层和老年人(经验丰富和/或愤世嫉俗的开发人员需要强大的源代码跟踪和可重复性(如果你必须满足关于开发过程的某些标准,就像我们曾在我曾经工作过的地方那样).好吧,你可以拥有一个中央"祝福"的回购; 你只是没有被束缚.例如,一个子团队很容易在他们的一个工作站上设置一个内部游乐场回购.
有很多方法可以让众所周知,它会让你坐下来仔细考虑你的工作流程.想想您目前的做法以及几乎免费的克隆和分支为您提供的力量.你现在所做的一些事情很可能已经演变为解决CVS型模型的局限性; 准备打破模具.您可能需要指定一两个冠军才能让所有人都顺利过渡; 有一个大团队,你可能想要考虑限制提交访问祝福.
在我的工作(小型软件公司),我们从CVS转移到hg,不会回去.我们以大多数集中的方式使用它.转换我们的主要(古代和非常大)回购是痛苦的,但它将是你去的任何方式,当它完成它已经完成 - 以后更改VCS会容易得多.(我们发现许多情况下,CVS转换工具无法弄清楚发生了什么;有些人的提交只是部分成功,他们几天都没有注意到;解决了供应商的分支;一般的疯狂和精神错乱造成的时间出现了向后,没有帮助在当地时间从不同时区提交时间戳...)
我发现DVCS的巨大好处是能够提前提交并经常提交,只有在准备就绪时才能推送.当我达到各种正在进行中的里程碑时,我喜欢在沙滩上划一条线,这样我就可以在需要的时候回到那里 - 但这些不是应该暴露给团队的承诺,因为它们显然是不完整的无数种方式.(我主要使用mercurial队列.)这完全是关于工作流程; 我无法用CVS做到这一点.
我想你已经知道了,但是如果你正在考虑离开CVS,你可以做得比SVN好得多......
整体,还是模块?无论你使用VCS,分发与否,任何范式转换都会变得棘手; CVS模型在如何允许您逐个文件地提交而不检查其余的repo是否是最新的(并且没有提到模块别名已知导致的头痛)方面非常特殊.
处理单片存储库可能相当慢.您的vcs客户端必须扫描整个Universe的副本以进行更改,而不是仅扫描单个模块.(如果您正在使用Linux,请查看hg inotify扩展,如果您还没有这样做.)
在提交(推动)时,整体回购也会导致不必要的竞争条件.这就像CVS最新的检查,但应用于整个仓库:如果你有很多活跃的开发人员,经常提交,这个会咬你.
我建议尽量远离单片,但要注意它会在构建系统中增加复杂性方面施加自己的开销.(旁注:如果你发现了一件令人烦恼的事情,那就自动完成吧!毕竟,我们的程序员都是懒惰的生物.)将你的仓库拆分成所有组件模块可能太极端了; 可能会找到一个中途房屋,其中相关组件在少数存储库中组合在一起.您可能还会发现查看mercurial的子模块支持是有用的 - 嵌套存储库和森林扩展(我应该尝试两种方式).
在以前的工作场所,我们有几十个组件,这些组件作为独立的CVS模块保存,具有相当规范的结构.组件声明了它们所依赖的内容以及哪些构建部件将被导出到哪里; 构建系统会自动编写make片段,以便您正在处理的内容将获取所需内容.它通常运作良好,很难通过CVS最新检查.(还有一个非常复杂但非常强大的构建机器人,对依赖项解析的态度最少:如果已经有一个满足您的要求,它将不会重建组件.添加到组件安装程序和整个组件的元组件ISO图像,你有一个很好的配方,易于从头到尾构建和Sorcerers Apprentice的事情.有人应该写一本关于它的书......)
首先,最近关于在大型项目中使用DVCS的一些讨论是相关的:
大型项目的分布式版本控制 - 可行吗?
Mercurial的一个问题是它似乎是围绕每个"项目"拥有一个存储库的想法而设计的.
是的,虽然Subversion的标准是拥有一个包含多个项目的单一存储库,但使用DVCS时,最好有更多粒度的存储库,每个组件一个.Subversion具有svn:externals
在结账时聚合多个源树的功能(具有其自身的后勤和技术问题).Mercurial和Git都有类似的功能,在hg中称为subrepos.
subrepos的想法是每个组件都有一个repo,可释放的产品(包含多个可重用的组件)将简单地引用其依赖的repos.克隆产品仓库时,它会带来所需的组件.
我们应该有一个包含所有内容的巨大Mercurial存储库吗?如果不是,那么较小的存储库应该有多细粒度?我认为如果他们必须从许多不同的地方提取和推送更新,人们会觉得非常讨厌,但如果他们必须拉/推整个公司的代码库,他们也会觉得很烦人.
当然可以拥有一个单片存储库(如果需要,您甚至可以将其拆分为轨道).这种方法的问题更可能归结为发布schedles,以及如何管理不同组件的不同版本.如果您有多个产品,他们自己的发布计划共享通用组件,那么您可能会采用更细粒度的方法,以促进配置管理.
需要注意的是,subrepo支持是一个相对较新的功能,并不像其他功能那样完全成熟.具体来说,并非所有的hg命令都知道subrepos,尽管最重要的是.
我建议你进行测试转换,并尝试subrepo支持,组织产品和依赖组件等.我正在做同样的事情,这似乎是要走的路.