过去(这里和这里)有几个关于 Hg 子回购依赖的问题,但接受的答案似乎并没有解决我的问题。
我的一个项目有4个依赖:A、B、C、D。D依赖A、B、C;并且 B 和 C 依赖于 A:
我想使用 Hg 子存储库来存储它们,这样我就可以跟踪它们所依赖的每个版本。这是因为,当我在这个项目中使用 A、B、C 和 D 时,其他项目只需要 A 和 B。因此,B 和 C 必须独立于 D 跟踪他们需要的 A 版本。同时,在我的应用程序中,给定版本 D 引用的 B 和 C 版本必须始终使用与给定版本的 D (否则它会在运行时倒下)。我真正想要的是允许它们在同一个目录中作为兄弟姐妹相互引用——即 D 的 .hgsub 如下所示,B 和 C 看起来像第一行。
..\A = https:(central kiln repo)\A
..\B = https:(central kiln repo)\B
..\C = https:(central kiln repo)\C
然而这似乎不起作用:我明白为什么(给人们足够的绳索来吊死自己很容易)但它很遗憾,因为我认为它是我依赖的最巧妙的解决方案。我已经阅读了一些建议的解决方案,我将快速概述它们以及为什么它们不适合我:
包括副本作为嵌套子目录,将这些作为 Hg 子存储库引用。这会产生以下目录结构(我已经删除了 A、B、C、B\A、C\A 的主要副本,因为我可以接受在 \D 中引用副本):
- project\(所有主要项目文件)
- 项目\D
- 项目\D\A
- 项目\D\B
- 项目\D\B\A
- 项目\D\C
- 项目\D\C\A
这种方法的问题:
- 我现在在磁盘上有 3 个 A 副本,所有这些都可以有独立的修改,必须在推送到中央仓库之前同步和合并。
- 我必须使用其他机制来确保 B、C 和 D 引用相同版本的 A(例如 D 可以使用 v1 而 D\B 可以使用 v2)
一种变体:使用上述但指定 .hgsub 的 RHS 以指向父副本中的副本(即 B 和 C 应具有以下 .hgsub):
A = ..\A
这种方法的问题:
- 我的磁盘上还有三个副本
- 我第一次克隆 B 或 C 时,它会尝试从“..\A”中递归地提取 A 的引用版本,这可能不存在,可能会导致错误。如果它不存在,它不会提供关于应该在哪里找到 repo 的任何线索。
- 当我对更改进行递归推送时,D\B\A 中的更改不会进入共享中央存储库;他们只是被推到 D\A 上。因此,如果我连续推送两次,我可以保证所有更改都将正确传播,但这完全是一个骗局。
- 同样,如果我进行(手动)递归拉取,我必须正确获取订单以获取最新更改(即在拉取 D\B\A 之前拉取 D\A)
使用符号链接将文件夹 \D\B\A 指向 D\A 等。
这种方法的问题:
- 符号链接不能在 Hg 存储库本身中编码,因此每次团队成员克隆存储库时,他们必须手动/使用脚本重新创建符号链接。这可能是可以接受的,但我更喜欢更好的解决方案。另外(个人喜好)我发现符号链接非常不直观。
这些是最好的可用解决方案吗?我的初始 .hgsub (见顶部)是一个梦想,或者有什么方法可以请求/实现这个改变?
更新以更好地解释 A、B、C、D 的更广泛使用