我正在尝试设置Mercurial存储库系统以与多个子存储库一起使用。我基本上已经遵循these instructions来使用Mercurial client v1.5设置客户端存储库,并且我正在使用HgWebDir托管我的多个项目。

我有一个具有以下结构的HgWebDir:

http://myserver/hg
|-- fooproj
|-- mylib

其中mylibfooproj要使用的一些通用模板库的集合。 fooproj的结构如下所示:
 fooproj
 |-- doc/
 |   `-- readme
 |-- src/
 |   `-- main.cpp
 |-- .hgignore
 |-- .hgsub
 `-- .hgsubstate
.hgsub看起来像:
src/mylib = http://myserver/hg/mylib

根据我对文档的解释,这应该有效:



同样,mylib项目目录结构如下所示:
mylib
|-- .hg
|   |-- 00changelog.i
|   |-- dirstate
|   |-- requires
|   |-- store
|   |   |-- 00changelog.i
|   |   |-- 00manifest.i
|   |   |   |-- data
|   |   |   |   ` magic.h.i
|   |   |-- fncache
|   |   `-- undo
|   |-- undo.branch
|   `-- undo.dirstate
`-- magic.h

因此,假设我使用以下命令将fooproj下拉到主文件夹中:
~$ hg clone http://myserver/hg/fooproj foo

它将适本地拉下目录结构,并添加文件夹~/foo/src/mylib,这是一个本地Mercurial存储库。这是问题开始的地方:mylib文件夹中除了.hg中的项目之外都是空的。来自Mercurial的消息是:
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 5 changes to 5 files
updating working directory
5 files updated, 0 files merged, 0 files removed, 0 files unresolved

经过2秒钟的调查,您可以看到src/mylib/.hg/hgrc是:
[paths]
default = http://myserver/hg/fooproj/src/mylib

这是完全错误的(尝试该存储库的pull将得到404,因为该URL没有任何意义)。
foo
|-- .hg
|   |-- 00changelog.i
|   |-- branch
|   |-- branchheads.cache
|   |-- dirstate
|   |-- hgrc
|   |-- requires
|   |-- store
|   |   |-- 00changelog.i
|   |   |-- 00manifest.i
|   |   |-- data
|   |   |   |-- .hgignore.i
|   |   |   |-- .hgsub.i
|   |   |   |-- .hgsubstate.i
|   |   |   |-- doc
|   |   |   |   `-- readme.i
|   |   |   `-- src
|   |   |       `-- main.cpp.i
|   |   |-- fncache
|   |   `-- undo
|   |-- tags.cache
|   |-- undo.branch
|   `-- undo.dirstate
|-- .hgignore
|-- .hgsub
|-- .hgsubstate
|-- doc
|   `-- readme
`-- src
    |-- main.cpp
    `-- mylib
        `-- .hg
            |-- 00changelog.i
            |-- branch
            |-- dirstate
            |-- hgrc
            |-- requires
            `-- store

从逻辑上讲,默认值应该是我在.hgsub中指定的值,否则它将以某种方式从存储库中获取文件。当然,将src/mylib/.hg/hgrc更改为:
[paths]
default = http://myserver/hg/mylib

并且运行hg pull && hg update可以完美运行。当然,这与首先不使用subrepos基本上是相同的。

Mercurial命令都没有返回错误代码(除了pull中的src/mylib之外),因此它显然认为它的行为正确(并且可能是正确的),尽管这似乎根本不合逻辑。

我究竟做错了什么?

最终的问题可能是.hgsubstate总是看起来像这样:
0000000000000000000000000000000000000000 src/mylib

但我不知道该如何解决...

最佳答案

.hgsub文件中的左侧路径相对于其在树中的位置。它已经在src中关闭了,因此src不需要在路径中。我认为如果使.hgsub文件看起来像这样:

mylib = http://myserver/hg/mylib

并将其保留在原样中,您将得到想要的东西。或者,您可以将.hgsub的位置上移一个目录(在根目录中src的外部),然后它现在是正确的。

我刚刚通过如下设置确认了这种解释:
.
|-- .hg
|   |-- 00changelog.i
|   |-- branch
|   |-- branchheads.cache
|   |-- dirstate
|   |-- last-message.txt
|   |-- requires
|   |-- store
|   |   |-- 00changelog.i
|   |   |-- 00manifest.i
|   |   |-- data
|   |   |   |-- .hgsub.i
|   |   |   `-- .hgsubstate.i
|   |   |-- fncache
|   |   `-- undo
|   |-- undo.branch
|   `-- undo.dirstate
|-- .hgsub
|-- .hgsubstate
`-- src
    `-- mylib
        |-- .hg
        |   |-- 00changelog.i
        |   |-- branch
        |   |-- branchheads.cache
        |   |-- dirstate
        |   |-- hgrc
        |   |-- last-message.txt
        |   |-- requires
        |   |-- store
        |   |   |-- 00changelog.i
        |   |   |-- 00manifest.i
        |   |   |-- data
        |   |   |   |-- .hgignore.i
        |   |   |   |-- _p_k_g-_i_n_f_o.i
        |   |   |   |-- _r_e_a_d_m_e.i
        |   |   |   |-- hgext
        |   |   |   |   `-- chart.py.i
        |   |   |   `-- setup.py.i
        |   |   |-- fncache
        |   |   `-- undo
        |   |-- tags.cache
        |   |-- undo.branch
        |   `-- undo.dirstate
        |-- .hgignore
        |-- PKG-INFO
        |-- README
        |-- hgext
        |   `-- chart.py
        `-- setup.py

该顶级.hgsub文件包含以下内容:
$ cat .hgsub
src/mylib = https://[email protected]/Ry4an/hg-chart-extension/

父级圆锥体显示它也克隆了子级:
$ hg clone parent parent-clone
updating to branch default
pulling subrepo src/mylib
requesting all changes
adding changesets
adding manifests
adding file changes
added 8 changesets with 14 changes to 5 files

09-25 21:37