我是mercurial的新手,我对我们公司正在努力实施的解决方案有疑问。我在具有严格安全环境的实验室工作,生产Mercurial服务器位于隔离网络中。所有人都有两台计算机,一台可以在现实世界中工作。另一个在孤立和安全的环境中工作。
问题在于我们在世界各地分布了其他实验室,在某些情况下,我们需要在项目中合作两个或更多实验室。每个实验室都有一个HG服务器,用于在本地管理自己的项目,但我不确定同步公共项目的方法是否是最佳解决方案。为了解决这个问题,我们使用"捆绑"将新闻变更集从一个实验室发送到另一个实验室。我的问题是这个方法有多好,因为解决方案有点复杂。程序或多或少都是这样的:
有人能告诉我如何找到摆脱这种困境的最佳解决方案吗? 任何人都有更好的解决方案吗?
非常感谢你的帮助。
答案 0 :(得分:2)
捆绑包是在没有直接连接的情况下传播更改的正确工具。但您可以通过在本地建模通信来简化捆绑构建过程:
您可以使用此双重设置来模拟实验室之间的关系,就像您有直接连接一样,但变更集共享通过捆绑而不是推/拉进行。
更具体地说(再次从实验室A的角度来看):
在开始时,repos会同步,但随着开发的进行,更改只会提交到 repoA。
现在是时候让实验室B加快速度了,只需转到 repoA 并运行hg outgoing path/to/repoB
。您现在知道要捆绑什么,而无需请求和研究实验室B的日志。实际上,hg bundle bundlename.bzip repoB
会为您捆绑正确的变更集。
加密并发送您的捆绑包。
您可以假设该捆绑包将集成到Lab B的主页回购中,因此也可以通过直接推送或(确保一致性)更新我们的本地 repoB 通过分拆(导入)邮寄的捆绑包。
当实验室B收到捆绑包时,他们会将其导入到他们自己的 repoA 副本中 - 现在它已更新为与 repoA 相同的状态实验A.实验B现在可以将更改推送或拉入他们自己的 repoB ,并将它们(在 repoB 中)与他们自己的非共享更改集合并。这将生成一个或多个合并变更集,其处理方式与实验室B的 repoB的任何其他签到一样。
就是这样。当实验室B将一个包发送回实验室A时,它将使用相同的过程,步骤1到5.一切都保持同步,就像存储库直接连接一样。与往常一样,经常同步以避免分歧过多并遇到合并冲突是值得的。
事实上,你有两个以上的实验室。保持它们同步的方法与直接连接相同:你想要一个"星形拓扑"中央服务器是其他实验室直接与之通信的唯一节点?然后每个实验室只需要该服务器的本地副本。在与每个人分享一些工作之前,您是否需要大量双边沟通?然后保留每个要与之交换变更集的实验室的本地模型。
答案 1 :(得分:0)
如果两个mercurial存储库之间没有直接的网络通信,那么您描述的方法似乎是同步这两个存储库的最简单方法。
在获取需要捆绑的新变更集时,您可能会在流程样板上节省一些,具体取决于。
一次,您无需更新工作副本即可创建捆绑包;只需拥有回购,就不够工作了。
如果你知道上次同步的日期和时间,你可以简单地使用适当的revset捆绑从那时起添加的所有变更集。自今年3月30日以来的所有修订:hg log -r'date(">2015-03-30")'
因此,您可以跳过冗长的人工审核流程。
如果您的存储库不是太大(因此适合您用于交换的媒体),只需将其完整地复制到那里并从该交换磁盘进行本地拉取以同步,也可以跳过这些审核流程。
当然,你将无法避免合并 - 当你有几个人同时处理同一件事并且都承诺自己的回购时,你必须付出代价。