我们从svn到hg都感到非常兴奋,并且由于开发工作流程或多或少被淘汰,这里仍然是最困难的部分 - 分段和集成系统。
希望这个问题比你的常见'我如何从xxx转移到Mercurial'更进一步。请原谅长期,可能写得不好的问题:)
我们是做很多项目(主要是PHP和Zend)的网上商店,所以我们有一个巨大的svn repo,有100多个文件夹,每个文件夹代表一个带有自己的标签,分支和主干的项目。在我们的集成和测试服务器上(QA和客户端查看工作结果和测试内容),一切都非常自动化 - Apache设置为自动创建新项目,为每个项目/主干创建vhost; mysql迁移脚本也在trunk中,开发人员可以通过简单的web界面应用它们。长话短说我们的工作流程就是现在:
当我们有2个以上的开发人员使用相同的代码时,这种方法对于大型项目来说肯定不是最理想的。 svn中的分支只会导致更多的头痛,因此转移到Mercurial。这就是问题所在 - 如何为这类工作组织有效的登台/集成/测试服务器(你有很多项目,比如单个开发人员可以在1天内完成3个不同的项目)。
我们决定基本上进行'默认'分支跟踪生产,然后在各个分支中进行所有更改。在这种情况下,我们如何自动化每个分支的暂存更新?如果早期的一个项目我们几乎总是在trunk上工作,那么我们需要一个DB,一个vhost等等。现在我们可能会讨论每个项目的N数据库,N-vhost配置等等。那么CI的东西(比如运行phpDocumentor和/或单元测试)?它应该只在'默认'上完成吗?在树枝上?
我想知道其他团队如何解决这个问题,也许是我们没有使用或忽略的一些最佳实践?
附加说明:
可能值得一提的是,我们选择了Kiln作为回购托管服务(主要是因为我们还在使用FogBugz)
答案 0 :(得分:3)
这绝不是你最终会选择的完整答案,但是这里有一些可能会影响它的工具:
clone -U
或hg update null
,您将获得一个没有工作目录的存储库(仅限.hg)。他们在服务器上更好,因为他们占用的空间更少,没有人想在那里编辑changegroup
挂钩对于最后一个,只要一个或多个变更集通过推送或拉动到达,changegroup
挂钩就会运行,你可以让它做一些有趣的事情,例如:
例如,人们可以仅使用上述工具自动执行此类操作:
hg update tip
肯定会在my-expiriment
分支上biggie和mercurial书中的第10章涵盖了这一点,就是不让用户等待这个过程。您希望用户推送到包含可能正常代码的repo,并且自动处理的CI执行CI并部署工作,如果它通过则最终成为可能的回购。
在我工作过的最大的mercurial设置中(20个左右的开发人员)我们已经达到了这样的程度:我们的CI系统(Hudson)每次定期从可能的ok存储库中提取,然后进行构建和测试,以及处理每个分支分开。
底线:您需要设置所有可能已经存在的所有工具,但将它们粘合在一起将是一次性的工作。
答案 1 :(得分:2)
您需要记住的是DVCS (vs. CVCS)为版本控制引入了另一个维度:
您不必再依赖 进行分支(并从右侧分支获取暂存工作区)
您现在使用DVCS publication workflow (在回购之间推/拉)
意味着您的暂存环境现在是一个仓库(具有项目的完整历史记录),在某个分支处签出:
许多开发人员可以将许多不同的分支推送到该临时仓库:协调过程可以在该仓库中单独完成,在您选择的“主”分支中。
或者他们可以在回购中拉出那个分段分支并在推回之前测试一下。
alt text http://hginit.com/i/02-repo.png
来自Joel关于Mercurial的教程 HgInit
开发人员无需提交给其他人查看:publication process in a DVCS允许他/她首先拉出暂存分支,在本地协调任何冲突,然后然后推送到分期回购。