1

我有3个项目:

D:\Projects\ProjectA\src\packA
D:\Projects\ProjectB\src\packB
D:\Projects\ProjectC\src\packC

我想将这 3 个项目的 3 个包存储在同一个远程存储库中。

我试图在我的远程存储库的克隆中克隆 3 个包:

D:\mercurial\DistantRepo\packA
D:\mercurial\DistantRepo\packB
D:\mercurial\DistantRepo\packC

然后我在 .hgsub 文件中将这 3 个包声明为子存储库:

packA = D:/Project/ProjectA/src/packA
packB = D:/Project/ProjectB/src/packB
packC = D:/Project/ProjectC/src/packC

我调用了hg addandhg commit命令。

但是当我尝试将文件推送到我的远程存储库时,.hgsub 和 .hgsubstate 文件被推送到我的远程存储库,但是我的包发生了以下情况:

pushing to https://my.distant.repo
pushing subrepo packA to D:/Projects/ProjectA/src/packA
searching for changes
no changes found
pushing subrepo packB to D:/Projects/ProjectB/src/packB
searching for changes
no changes found
pushing subrepo packC to D:/Projects/ProjectC/src/packC
searching for changes
no changes found
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 1 changesets with 2 changes to 2 files

看来我误解了子存储库的工作方式......

子存储库的使用是否符合我的用例?我想做的事怎么可能完成?

4

1 回答 1

0

未发现任何更改

pushing subrepo packA to D:/Projects/ProjectA/src/packA
searching for changes
no changes found

这意味着没有任何变更集packA不在D:/Projects/ProjectA/src/packA. 这没关系,如果

  • 真的没有什么新东西packA
  • 你已经推packAD:/Projects/ProjectA/src/packA

如果有疑问hg outguing D:/Projects/ProjectA/src/packA,请在packA目录内确定。这个命令应该没有输出(=没有发送)。

路径

D:/Projects/Project[ABC]/src/pack[ABC]由于您在 .hgsub 文件中提供了 mercurial 这些绝对 URL,因此这些子存储库被推送到。将 .hgsub 更改为如下所示可能会更好:

packA = packA
packB = packB
packC = packC

# You can also insert something like packA = ProjectA/src/packA, the point
# is to declare all subrepos as subdirectories of the main repo

并更改服务器以使其服务

  • 原始产品位于 /
  • /packA 处的 ProjectA/src/packA
  • /packB 处的 ProjectB/src/packB
  • /packC 处的项目C/src/packC

这是推荐的模式,因为您可以轻松地拥有此 repo 的本地镜像克隆,而使用本地镜像的相对和绝对 URL 会遇到麻烦(这是可能的,但很麻烦)。

作为旁注,您还可以考虑使用依赖跟踪外部存储库(在 hg wiki 中称为“瘦壳存储库”),它将您的 pack* 存储库以及产品存储库嵌入为子存储库,因为它更清楚每个软件所属的地方。

编辑

在 mercurial 中,每个产品只能有一个存储库,并且在每个存储库的 URL 上的服务器上。这意味着您需要为您的主产品和子存储库设置不同的远程存储库,因为您不能将不同子存储库的内容与产品存储库一起存储。

有可能将hg pull -f这些不同的存储库合二为一,但我建议不要这样做。在这样的拉动之后,很难在这个存储库的历史中导航,因为不同来源的历史是混合的(例如,每次有人推入时,这个 repo 的尖端修订在不同的来源之间交换)。你应该只使用这种方法,当不同的 subrepos 共享一些共同的历史时,但是当它们没有共同点时最好将它们分开。

于 2011-09-08T14:35:44.610 回答