"连结"两个存储库的修订版

时间:2015-04-09 08:07:28

标签: mercurial revision-history

我们处于这样一种情况:我们有一个“通用模块”存储库,它在不同的项目存储库之间共享。我们面临的问题是,如果您回到项目的早期版本,我们无法真正知道该项目使用了哪些“通用模块”修订版。我们可以检查日期和时间戳,看看它们是否匹配,但必须有另一种更优雅的方法来做到这一点。通用模块存储库不会像项目本身那样频繁地更改。我的问题是:你如何处理这个以及最佳做法是什么?

2 个答案:

答案 0 :(得分:4)

我认为对于你所追求的目标有几种选择,虽然我认为这两种选择只对未来有所帮助,并且无法真正解决你过去的历史。

子储存库

Subrepos是您问题的原始Mercurial解决方案 将常规模块repo克隆到主项目工作副本中,并将其工作副本更新为要使用的修订版本 然后你设置一个.hgsub文件,它告诉主项目它有一个subrepo,它应该去哪里以及它的来源。
然后,当您提交主项目时,将提交.hgsub,并将通用模块工作副本的哈希值保存到.hgsubstate文件中的修订版中。

然而,它们存在问题,

  • 递归提交和推送,这可能是不可取的;
  • 它们可能难以理解,因此是错误的根源;
  • 如果您移动源代码库,您的更新将会失败,尽管有subpaths config option可以解决此问题。

Here's a good walkthrough on using subrepos.

访客回购

我从来没有使用过这些,所以我不能评论他们的利弊甚至是他们的使用,但这里是Guest Repos Extension的链接。 我认为这个想法是它比subrepo设置更容错,所以如果guest虚拟机repo源丢失或指定的变更集丢失,它就更容易修复。

我也看到了对嵌套repos的引用,这与guest repos有点不同,但我不确定它们是否真的是不同的东西。

答案 1 :(得分:1)

除了使用子存储库等之外,另一种选择是使用像Peru这样的工具,这使得存储库同步既可以是显式手动操作,也可以作为构建过程的一部分使用。如果您需要与组织外部的存储库集成,使用不同VCS(或根本不存在)等存储库,则此功能特别有用。