如何设置一个DVCS系统,保留我们对集中式VCS的一些好处?

时间:2011-08-01 01:08:16

标签: mercurial dvcs

目前,我们有一小组开发人员使用TFS进行版本控制。我正在评估我们转向DVCS的可能性,我想知道如果我们转向DVCS,或者我们是否能找到支持它的方法,我们是否需要放弃一些我们喜欢的当前系统的东西

现在我们是一个Stable分支,每个开发人员都有一个分支(您可以将每个dev的分支视为从功能到功能重用的功能分支)。我们喜欢的东西是:

1)每次dev检查其分支的更改时,我们都会对服务器上的所有内容进行构建和测试,然后自动将所有项目部署到该开发人员测试环境。

2)从任何dev的分支到Stable的合并都由我完成,这样我可以在提交更改之前最后检查我们的稳定分支发生了什么。

3)如果我想用某些东西帮助开发者,我可以从他们的分支中获取最新信息并在我的机器上查看它。

我正在尝试理解这对DVCS有何用处(特别是我们正在使用Mercurial进行测试)。

我希望能够实现这样的目标:

1)我们设置了一个中央存储库,除了每个开发人员的1个分支外,我们还创建了Main和Release分支。

2)所有开发人员将存储库克隆到本地计算机。

3)所有工作都在他们的个人分支中针对本地存储库完成。

4)完成后,将从中央存储库中取出,并执行从Main到其分支的本地前向集成合并,以将过去发生的任何更改集成到Main。

5)然后他们会将更改推送到中央存储库。

6)有些CI服务会接受此更改,导致我们在该分支中的所有项目的构建/测试/部署到开发。

7)如果一切正常,开发人员会给我发一封电子邮件,说他们的分支已准备好合并到Main。

8)然后我可以合并他们的更改,或者通过某种方式直接连接到删除存储库,或者通过执行pull-> merge->推送。

所以要处理我们的要求:

1)我假设有一些CI工具可以在Mercurial中观看分支,并启动构建/测试/部署过程(如CC.Net)。

2)我仍然可以通过连接到远程仓库,或通过拉动,合并和推送我的本地仓库来管理从DevX到Main的最终合并过程。

3)我相信我可以直接从另一个开发者仓库中提取更改,或者我可以从中央仓库中提取,然后更新我的工作目录以处理他们的代码。

所以我的这个大部分都是正确的吗?

1 个答案:

答案 0 :(得分:2)

是的,你做得很对。关于你的最终假设:

1) CruiseControl.NET有一个Mercurial Source Control Block。我听说过与Mercurial一起使用的另一个CI服务器是Jenkins

2)正确。为了与Main集成,我宁愿在推送之前拉(从任一个)并在我自己的机器上合并,而不是在服务器上合并。

3)确实如此。

听起来你的开发人员很有纪律,但万一你需要更好地控制你操作的某些方面:

  • 当有人尝试将其分支合并到Main时,您可以使用hooks发出警告。进程内钩子必须用Python编写,但是他们可以通过这种方式访问​​Mercurial API。您还可以在服务器上放置挂钩,拒绝包含合并到Main的推送,而不是由某些用户完成。
  • 某些组织控制集成的一种方式是仅限拉动方案。只有少数开发人员可以推送到官方存储库,其他开发人员会向他们发送拉取请求。 Mercurial书的Chapter 6也涵盖了这一点。

每个开发人员的分支都很好。每个功能的分支也很有用,允许每个开发人员并行处理多个事情,然后在完成时将每个事务合并到他们的分支。他们只需要记住在这样做之前关闭该功能分支,因此分支名称不会一直弹出。这也可以用克隆来完成,但我发现自己更喜欢命名分支,因为我必须保持工作/备份/笔记本电脑开发克隆全部同步,所以我可以随时工作whateve。我仍然首先作为克隆进行消耗性工作。