我有一个使用相当标准的源代码树方法 + mercurial 子存储库的主项目。
Master
\lib - compiled binaries - things like log4net, AutoFac, etc
\source - VS solution, one folder per project, etc
\tools - stuff used during the build process
\source\contrib - contains any subrepos like so:
\source\contrib\Sub1
\source\contrib\Sub2
Master\.hgsub contains something like
source\contrib\Sub1 = https://myserver.com/Sub1
现在,最近确定 Sub2 需要来自 Sub1 的一些代码,因此我必须针对这个新的依赖结构进行调整。
问题当然是,如果我遵循与上述相同的方法并将 Sub1 添加为 Sub2 的子存储库,我最终会遇到这种丑陋的情况。
\source\contrib\Sub2\source\contrib\Sub1
Master现在有2个独立的Sub1副本!
所以我知道在引用 subrepos(= 的 RHS)时我应该使用相对路径——但据我所知,这对我的场景没有帮助。我认为没有任何方法可以使 LHS位于主存储库之外,我认为这是我在这里真正需要的。
我有几个关于如何解决这个问题的想法,但没有一个适合我,我认为必须有更好的方法。我理想的解决方案允许我在多个项目之间共享相同的子存储库,而无需支付拥有多个副本的代价。在我的场景中,这似乎既浪费又低效(另外,我希望所有依赖 Sub1 的项目都使用相同的 hg 修订,而不是独立修订)
删除 Sub1 作为 Master 的子存储库,并更改 Master 解决方案中的任何相对路径以引用双重嵌套的 Sub1。这种路径结构不仅可怕,而且如果将 Sub3 添加到依赖于 Sub1 的主控,我仍然有 2 个 Sub1 副本。
编译 Sub1 的副本并将其放入 \lib 目录。Sub1 仍在经历一些混乱,我宁愿针对源版本进行构建。我不想一直为不断地将新的二进制文件复制到源代码树而付出代价(并使树膨胀)。
以某种方式打破 Sub2 对 Sub1 的依赖。根据存储库的架构,这可能不会发生。Sub1 包含一些非常通用的共享库代码。Sub2 包含两个非常独立的项目(客户端 SDK 和服务器实现)所需的 WCF 服务合同/接口/类型。此时,将这些存储库分开是有意义的。
也许我在想这个错误......或者我可能不知道一些汞技巧。
任何帮助表示赞赏。