将Mercurial存储库与两个没有连接的中央服务器同步

时间:2015-12-09 10:29:10

标签: mercurial synchronization distributed

我是mercurial的新手,我对我们公司正在努力实施的解决方案有疑问。我在具有严格安全环境的实验室工作,生产Mercurial服务器位于隔离网络中。所有人都有两台计算机,一台可以在现实世界中工作。另一个在孤立和安全的环境中工作。

问题在于我们在世界各地分布了其他实验室,在某些情况下,我们需要在项目中合作两个或更多实验室。每个实验室都有一个HG服务器,用于在本地管理自己的项目,但我不确定同步公共项目的方法是否是最佳解决方案。为了解决这个问题,我们使用"捆绑"将新闻变更集从一个实验室发送到另一个实验室。我的问题是这个方法有多好,因为解决方案有点复杂。程序或多或少都是这样的:

  • 在实验B中,hg拉取并更新以确定本地文件夹中的最新版本。 向对方询问" hg log",看看最后一个常见的变更集是什么。
  • 在实验室A:hg pull and update以确定本地文件夹中的最新版本。
  • 在实验室A:制作捆绑包," hg bundle --base XX project.bundle" (其中XX是最后一个常见的变更集)。
  • 将其发送给实验室B(由于安全规范,使用复杂的方法:加密文件,加密驱动器,安全擦除等)。
  • 在实验室B中:" hg unbundle projectYY.bundle"在本地文件夹中。
  • 此过程会创建两个头,有时会强制您进行合并。
  • 一旦实验室A的变更集在实验室B上正确实施,我们需要以相反的方向重复该过程,以实现实验室B中项目向实验室A的演变。

有人能告诉我如何找到摆脱这种困境的最佳解决方案吗? 任何人都有更好的解决方案吗?

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:2)

捆绑包是在没有直接连接的情况下传播更改的正确工具。但您可以通过在本地建模通信来简化捆绑构建过程:

  • 在实验室A中,维护 repoA (本地使用的中央存储库)以及 repoB ,它代表实验室B中存储库的状态。实验B有一个互补的设置。

您可以使用此双重设置来模拟实验室之间的关系,就像您有直接连接一样,但变更集共享通过捆绑而不是推/拉进行。

  • 从实验室A的角度:以常规方式更新 repoA ,但只更新 repoB ,只能使用从实验室B收到的捆绑包和捆绑包(或更改集)正在发送给实验室B.

更具体地说(再次从实验室A的角度来看):

  1. 在开始时,repos会同步,但随着开发的进行,更改只会提交到 repoA。

  2. 现在是时候让实验室B加快速度了,只需转到 repoA 并运行hg outgoing path/to/repoB。您现在知道要捆绑什么,而无需请求和研究实验室B的日志。实际上,hg bundle bundlename.bzip repoB会为您捆绑正确的变更集。

  3. 加密并发送您的捆绑包。

  4. 您可以假设该捆绑包将集成到Lab B的主页回购中,因此也可以通过直接推送或(确保一致性)更新我们的本地 repoB 通过分拆(导入)邮寄的捆绑包。

  5. 当实验室B收到捆绑包时,他们会将其导入到他们自己的 repoA 副本中 - 现在它已更新为与 repoA 相同的状态实验A.实验B现在可以将更改推送或拉入他们自己的 repoB ,并将它们(在 repoB 中)与他们自己的非共享更改集合并。这将生成一个或多个合并变更集,其处理方式与实验室B的 repoB的任何其他签到一样。

  6. 就是这样。当实验室B将一个包发送回实验室A时,它将使用相同的过程,步骤1到5.一切都保持同步,就像存储库直接连接一样。与往常一样,经常同步以避免分歧过多并遇到合并冲突是值得的。

    事实上,你有两个以上的实验室。保持它们同步的方法与直接连接相同:你想要一个"星形拓扑"中央服务器是其他实验室直接与之通信的唯一节点?然后每个实验室只需要该服务器的本地副本。在与每个人分享一些工作之前,您是否需要大量双边沟通?然后保留每个要与之交换变更集的实验室的本地模型。

答案 1 :(得分:0)

如果两个mercurial存储库之间没有直接的网络通信,那么您描述的方法似乎是同步这两个存储库的最简单方法。

在获取需要捆绑的新变更集时,您可能会在流程样板上节省一些,具体取决于。

一次,您无需更新工作副本即可创建捆绑包;只需拥有回购,就不够工作了。

如果你知道上次同步的日期和时间,你可以简单地使用适当的revset捆绑从那时起添加的所有变更集。自今年3月30日以来的所有修订:hg log -r'date(">2015-03-30")'因此,您可以跳过冗长的人工审核流程。

如果您的存储库不是太大(因此适合您用于交换的媒体),只需将其完整地复制到那里并从该交换磁盘进行本地拉取以同步,也可以跳过这些审核流程。

当然,你将无法避免合并 - 当你有几个人同时处理同一件事并且都承诺自己的回购时,你必须付出代价。