5

我在 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 抛出错误“中止:存储库不相关”。

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

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

4

2 回答 2

6

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

SubFolder1 = SubFolder1
SubFolder2 = SubFolder2
[subpaths]
(https://(?:[^@]+@)?bitbucket\.org/[^/]+)(/[^/]+)/(.*) = \1/\3
于 2012-12-08T23:21:29.477 回答
2

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

子存储库表面上是在多个项目之间共享的库,因此不存在于任何一个主存储库下,而是存在于它们自己的空间中。因此,您必须创建单独的远程存储库来容纳每个子存储库(库)并在 .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
于 2015-07-12T03:24:46.237 回答