5

我正在尝试设置我的 Mercurial 存储库系统以使用多个子存储库。我基本上按照这些说明使用 Mercurial 客户端 v1.5 设置客户端存储库,并且我正在使用HgWebDir来托管我的多个项目。

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

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

在哪里mylib可以使用一些通用模板库集合fooproj。的结构fooproj看起来像这样:

 fooproj
 |-- doc/
 |   `-- readme
 |-- src/
 |   `-- main.cpp
 |-- .hgignore
 |-- .hgsub
 `-- .hgsubstate

.hgsub看起来像:

src/mylib = http://myserver/hg/mylib

根据我对文档的解释,这应该可行:

第一个“嵌套”是我们工作目录中的路径,第二个是要从中提取的 URL 或路径。

此外,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该 repo 将给出 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 命令都没有返回错误代码(除了 from pullinside src/mylib),因此它清楚地认为它的行为正确(并且可能是正确的),尽管这似乎根本不合逻辑。

我究竟做错了什么?

最终的问题可能.hgsubstate总是看起来像:

0000000000000000000000000000000000000000 src/mylib

但我不知道如何解决这个问题......

4

1 回答 1

4

文件中的左侧路径.hgsub相对于它在树中的位置。它已经在 中src,因此src不需要在路径中。我想如果你让.hgsub文件看起来像:

mylib = http://myserver/hg/mylib

把它留在原处,你会得到你想要的。或者,您可以将.hgsub目录的位置向上移动(在 之外src,在您的root中),然后它会像现在一样正确。

我刚刚用这样的设置证实了这种解释:

.
|-- .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://Ry4an@bitbucket.org/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
于 2010-04-03T14:57:40.020 回答