使用带有bitbucket和ToritoiseHg的子存储库

时间:2012-12-06 19:03:22

标签: mercurial tortoisehg bitbucket subrepos mercurial-subrepos

我在TortoiseHg中有以下子库结构:

/MainFolder/
/MainFolder/SubFolder1
/MainFolder/SubFolder2

MainFolder是bitbucket上的私有存储库 SubFolder1是bitbucket上的私有存储库 SubFolder2是bitbucket上的私有存储库

MainFolder中的文件.hgsub如下所示:

SubFolder1 = SubFolder1
SubFolder2 = SubFolder2

MainFolder中的文件.hgsubstat也有有效的guid和子存储库名称。

问题是每当我尝试为MainFolder推送bitbucket时,首先它会推送MainFolder,然后推送SubFolder1,但是当它到达SubFolder2时,TortoiseHg会抛出错误“abort:repository is unrelated”。

当我在bitbucket上检查我的MainFolder存储库时,它实际上有SubFolder1的内容(它应该作为子存储库列在那里)。

如何解决这个问题,以便将MainFolder正确上传为父存储库,并将SubFolder1和SubFolder2列为bitbucket上的子存储库?

2 个答案:

答案 0 :(得分:6)

bitbucket文档中显示的example需要重命名存储库,以便所有存储库都被命名为 MainRepository-SubRepository 。我不想重命名我的所有存储库,因此修改了正则表达式,如下面的示例所示,现在它可以正常工作。此版本不需要存储库名称中的破折号分隔符,可以单独命名主存储库和子存储库。示例.hgsub看起来像这样:

SubFolder1 = SubFolder1
SubFolder2 = SubFolder2
[subpaths]
(https://(?:[^@]+@)?bitbucket\.org/[^/]+)(/[^/]+)/(.*) = \1/\3

答案 1 :(得分:2)

Bitbucket不会在原地进行subrepos。因此,Mercurial正试图将您的每个存储库推送到同一位置,并在您尝试将repo SubFolder2推送到SubFolder1 repo的远程副本时发出抱怨。

子存储库表面上是在多个项目之间共享的库,因此不会存在于任何一个主存储库之下,而是存在于自己的空间中。因此,您必须创建单独的远程存储库来容纳每个子存储库(库)并引用.hgsub文件中的单独远程路径。

例如,您的示例项目可能有三个bitbucket托管的存储库

https://bitbucket.org/bitbucketname/main_project
https://bitbucket.org/bitbucketname/library1
https://bitbucket.org/bitbucketname/library2

您希望本地克隆的文件空间如下所示:

/MainFolder/
/MainFolder/SubFolder1
/MainFolder/SubFolder2

在main_project(MainFolder)的本地克隆中,将父存储库的默认路径设置为https://bitbucket.org/bitbucketname/main_project

即,/MainFolder/.hg/hgrc包含

[paths]
default = https://bitbucket.org/bitbucketname/main_project

现在,指明.hgsub文件中子库/库的远程路径。 .hgsub条目的一般格式为:

local/path/to/subrepo = remote/path/to/matching/library

所以你的.hgsub可能包含相对的本地和远程路径(相对于本地或远程主要仓库的位置,视具体情况而定):

SubFolder1 = ../library1
SubFolder2 = ../library2

或具有到每个库的远程仓库的绝对路径的相对本地路径:

SubFolder1 = https://bitbucket.org/bitbucketname/library1
SubFolder2 = https://bitbucket.org/bitbucketname/library2

或一切的绝对路径:

/MainFolder/SubFolder1 = https://bitbucket.org/bitbucketname/library1
/MainFolder/SubFolder2 = https://bitbucket.org/bitbucketname/library2

现在,当您从本地主项目推送时,Mercurial确切地知道在哪里找到所有子库(本地)以及在何处推送对每个库所做的更改(远程)。

此外,假设您要将其他人的库添加到您的项目中。然后你的.hgsub看起来像这样:

SubFolder1 = ../library1
SubFolder2 = ../library2
another_library = https://bitbucket.org/honkaboy/honkaboys_excellent_library