我有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 add
和hg 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
我似乎误解了子存储库的工作原理......
子存储库的使用是否符合我的用例?我想做什么可能会怎么做?
答案 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
并更改服务器以使其服务
这是一个recommended pattern,因为您可以轻松拥有此repo的本地镜像克隆,而使用本地镜像的相对和绝对URL会遇到问题(这可能,但很麻烦)。
作为旁注,您可能还会考虑使用依赖关系跟踪外部存储库(在hg wiki中称为“thin shell repository”),它将您的pack * repos以及产品仓库嵌入subrepos,因为比每个软件所属的地方更清楚。
修改强>
在mercurial中,每个产品只能有一个存储库,而每个存储库的URL上只有一个存储库。这意味着您需要为主产品和子目录设置不同的远程存储库,因为您无法将不同子存储库的内容与产品存储库一起存储。
有可能将hg pull -f
这些不同的存储库合二为一,但我建议不要这样做。在这样的拉动之后,在这个存储库的历史中导航是非常困难的,因为不同来源的历史是混合的(例如,每次有人在不同来源之间交换此回购的最新修订版本推进它)。你应该只使用这种方法,当不同的子目录共享一些共同的历史时,但最好在它们没有任何共同点时将它们分开。