目前,我们有一小组开发人员使用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)我相信我可以直接从另一个开发者仓库中提取更改,或者我可以从中央仓库中提取,然后更新我的工作目录以处理他们的代码。
所以我的这个大部分都是正确的吗?
答案 0 :(得分:2)
1) CruiseControl.NET有一个Mercurial Source Control Block。我听说过与Mercurial一起使用的另一个CI服务器是Jenkins。
2)正确。为了与Main
集成,我宁愿在推送之前拉(从任一个)并在我自己的机器上合并,而不是在服务器上合并。
3)确实如此。
听起来你的开发人员很有纪律,但万一你需要更好地控制你操作的某些方面:
Main
时,您可以使用hooks发出警告。进程内钩子必须用Python编写,但是他们可以通过这种方式访问Mercurial API。您还可以在服务器上放置挂钩,拒绝包含合并到Main
的推送,而不是由某些用户完成。每个开发人员的分支都很好。每个功能的分支也很有用,允许每个开发人员并行处理多个事情,然后在完成时将每个事务合并到他们的分支。他们只需要记住在这样做之前关闭该功能分支,因此分支名称不会一直弹出。这也可以用克隆来完成,但我发现自己更喜欢命名分支,因为我必须保持工作/备份/笔记本电脑开发克隆全部同步,所以我可以随时工作whateve。我仍然首先作为克隆进行消耗性工作。