2011-05-19 46 views
0

首先,我一直盯着一页一页的解决方案,但没有一篇似乎适合我的情况。使用Mercurial(hg)跟踪更改并自动进行同步?

我在全国各地都有使用Windows工作站和Eclipse的网络开发人员。我们决定DVCS最适合我们,因为集中式系统无法正常工作(Serena:慢速网络连接需要永久检查...他们不这样做,因为它不是“精简”等)

我们使用Eclipse来编辑和修改处于不同状态的开发服务器上的文件。 (大多数DVCS方案假设您的工作站上安装了Web服务器或正在进行二进制可执行开发。)

我想尝试的是为开发人员更改和“功能播放”设置本地存储库,但会自动保留开发库是最新的。我想过使用Mercurial钩子来自动拉/更新/合并/推送,但这需要开发人员在每次他们想要测试更改时提交。 (为了将钩子上传他们的文件到开发服务器)。这是自动发生在文件保存上的理想选择,因为它已经是培训人们使用版本控制的一个问题(主要是因为目前PITA速度很慢广域网和虚拟位置,不能选择升级广域网)

我的猜测是我将不得不设置Unison或其他东西来保持开发人员的资料库同步到开发服务器,就好像它是本地复制,当然会与其他开发人员同步。我试图找出是否有人有一个简化/简单的解决方案,让所有开发人员保持最新,同时允许他们随意版本控制(容易)。

+2

在某些时候,开发人员必须说“我对此感到满意”,这就是一个承诺。这是版本控制的本质,并没有避免它。做提交文件保存(如果这是我明白你建议)是疯狂。 – 2011-05-19 19:44:02

+0

是的,这就是为什么我认为我们将不得不建立一个同步解决方案才能做到这一点。在每个工作站上放置一个开发环境在我们的情况下是不可行的。 – Andir 2011-05-19 20:19:24

+1

对不起,这只是一个警察。我不在乎你的webapp是否是空间激光器的前端,并且需要具有50,000美元座位许可证的软件 - 你可以并且应该为每个开发人员的在台测试嘲笑它。 “让我们看看远程服务器上的这种工作是否是我们10年前的生活中的伤心事,但现在没有必要承担大量的生产力。使用VM或Mocks或为每个开发者花费10K美元;不管它花费多少时间,美元都将在实际生产率上得到弥补。 – 2011-05-20 02:23:44

回答

0

这是分支机构的用途。有一个名为“unstable”的分支,并使用一个存储库来设置你的开发服务器,该存储库在提交/合并时自动更新到只有该分支(通过挂钩)。单个开发人员可以自由处理功能分支并在本地提交。当某些东西准备好共享时,开发人员将他们的更改合并到“unstable”分支中,并将该分支推送到开发服务器/存储库。

我以这种方式管理我的部署。我的Web服务器虚拟主机Web根指向Mercurial存储库/工作副本。当某些东西准备出去时,我将它合并到“稳定”分支中,并将“稳定”推送到服务器。存储库挂钩使用新的更改更新虚拟主机上的文件。

[hooks] 
changegroup = /usr/bin/hg update stable >&2 

我一直只做了一个月左右,但它一直在像一个魅力。

另外,哈得逊/詹金斯+1。你在找什么叫做“持续整合”(CI),哈德森和詹金斯是这样做的。

如果你在所有的工作站上都​​没有开发服务器,那么可能使用测试驱动开发和你的语言的某种单元测试框架工作 - 其中大多数不需要完整的服务器实现能够编写和测试你的代码。这需要改变范式,但你肯定会得到更好的代码质量。

+0

这是一个整洁的概念,但它仍然遇到了开发人员无法在本地进行测试的问题(本地没有框架来测试他们的代码,但是它给了我一些关于其他方面的想法,所以谢谢获取信息! – Andir 2011-05-19 21:55:48

0

我们对mercurial很满意,但我们不得不改变我们的习惯......并花了一段时间

每个开发者现在都有一个本地的测试平台。提交是通过分支进行的,在本地验证测试之前不会推送任何东西

然后,哈德森是我们的朋友。要整合团队作品,每次提交都会生成一个测试应用程序完整性的构建。红色表示回滚并返回到开发者。绿色很酷

开发人员在这里提交'理智'的代码,并通过团队整合到中央回购。他们必须决定什么时候推动。没有同步任务可以让他们摆脱这种负担。当我看到所有可能发生,由一个人即使每个推选择是consciensciouly所犯的错误,我无法想象,如果改变对每个文件自动保存发生

与水银的好经验......

+0

“每个开发者现在都有一个本地测试平台。” - 这是我们不能做的事情。我们在开发服务器上开发框架和不同模块,因此拥有本地开发环境意味着要在本地SQL服务器中复制大量数据,认证,许可......不会发生。 – Andir 2011-05-19 20:15:47

+0

是受限测试平台,每个模块进行单元测试和集成测试。这不是整个平台。但那不是重点。每个组织都是不同的,我的并不是一个完美的模型。这只是Mercurial如何改变我们的习惯并帮助我们改进我们的过程的体验。但是确实存在限制。 “ – Grooveek 2011-05-19 20:25:26

+0

”在本地SQL Server中复制大量数据“是一个赠品。您可能想要认真考虑测试驱动开发,并使用某种模拟/存根框架。您不需要本地数据库来完成此任务,并且您现在可以使用实际数据在开发服务器上进行集成测试。 – bpanulla 2011-05-19 21:07:55

0

你说你想拥有一个开发人员更改的本地存储库,但会自动将任何更改推送到服务器。如果您无法使用本地开发环境来测试更改,那么拥有本地开发分支有什么意义?如果您的测试必须在开发服务器上完成,那么我不能想到在本地存储库中允许“功能游戏”,同时在开发服务器上保持任何形式的理智。

在这种情况下,最好的办法可能是在开发服务器上分支并让服务器签出不同的分支来测试不同的功能(hg update -C feature-blah)。服务器存储库的默认状态应该是主要“devel”分支(hg update -C devel)的检出,并且当任何功能或错误修复分支被验证为工作时,它们将合并回“devel”并更新服务器的存储库从那。

编辑说明:您的开发人员可以从“开发”或从功能分支结帐到他们的本地机器。然后,他们会进行任何编辑并将其推回到服务器,然后将服务器的活动分支切换到最新更新的代码。

此外,我从您的其他评论中认为,只有一个开发服务器,并且它一次只能运行一个版本的代码。如果情况并非如此,我的答案完全没有意义。

+0

是的,一个开发服务器。幸运的是,所有的开发人员通常不会在相同的文件上工作,所以冲突很小,但是能够解决某些冲突会很好。因此,工作分支的本地存储库被同步到服务器。如果有覆盖,你仍然有你的本地。对困惑感到抱歉。据我所知,如果只有一台服务器,两个开发人员同时在不同的功能部件上同时工作,实际上是不可能的。我不知道我是否有兴趣让开发者服务器定期检查内容。 – Andir 2011-05-19 21:49:01

+0

为了解决冲突,这就是合并的目的。 Mercurial将自动找出如何组合变更集。使用所描述的方法,如果出现错误,您仍然可以恢复以前的修订版本,并且无论如何都会在功能分支上进行实验性更改,因此您仍然可以使用半稳定的devel分支切换回。就开发服务器“检出”而言,像Mercurial交换分支这样的DVCS是快速而平凡的。您可能需要更深入地了解DVCS的工作原理,以便为您的工作流找到最佳解决方案。 – 2011-05-19 22:14:05