我在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上的子存储库?
答案 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