subrepos - Mercurial的子存储库是否可用于在存储库中推送多个项目?

时间:2011-09-08 01:14:43

标签: mercurial subrepos mercurial-subrepos

我有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 addhg 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

我似乎误解了子存储库的工作原理......

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

1 个答案:

答案 0 :(得分:0)

未找到任何更改

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

这意味着packA中没有D:/Projects/ProjectA/src/packA中没有的变更集。如果

,这没关系
  • packA
  • 中确实没有新内容
  • 您已将packA推送到D:/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

并更改服务器以使其服务

  • 原始产品/
  • ProjectA / src / packA at / packA
  • / packB
  • 中的ProjectB / src / packB
  • ProjectC / src / packC at / packC

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

作为旁注,您可能还会考虑使用依赖关系跟踪外部存储库(在hg wiki中称为“thin shell repository”),它将您的pack * repos以及产品仓库嵌入subrepos,因为比每个软件所属的地方更清楚。

修改

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

有可能将hg pull -f这些不同的存储库合二为一,但我建议不要这样做。在这样的拉动之后,在这个存储库的历史中导航是非常困难的,因为不同来源的历史是混合的(例如,每次有人在不同来源之间交换此回购的最新修订版本推进它)。你应该只使用这种方法,当不同的子目录共享一些共同的历史时,但最好在它们没有任何共同点时将它们分开。