【问题标题】:Mercurial Remote SubreposMercurial Remote Subrepos
【发布时间】:2010-04-03 06:50:26
【问题描述】:

我正在尝试设置我的 Mercurial 存储库系统以使用多个子存储库。我基本上遵循these instructions 来使用 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 存储库。这就是问题开始的地方:除了.hg 中的项目之外,mylib 文件夹是空的。 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

这是完全错误的(尝试使用该 repo 的 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 命令返回错误代码(除了 src/mylib 中的 pull),因此它清楚地认为它的行为正确(而且可能是正确的),尽管这似乎根本不合逻辑。

我做错了什么?

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

0000000000000000000000000000000000000000 src/mylib

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

【问题讨论】:

    标签: mercurial subrepos


    【解决方案1】:

    .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
    

    【讨论】:

    • 我的.hgsub 也在顶级目录中(我想这并不清楚)......问题是当我克隆时......它只是不拉子回购适当地。如果它位于顶级目录 (mylib = http://myserver/hg/mylib) 中,它可以正常工作,但我需要将其签出到 src/mylib。
    • 你说得对,我只是误读了你的树输出。您能否尝试根据我对这个问题的回答运行我的脚本:stackoverflow.com/questions/2570289/… 我最初将它们设置为同级存储库,然后将一个作为父级链接到另一个。执行该提交时, hgsubstate 会更新。随后,我可以克隆父级并将孩子作为子存储库获取,而无需额外克隆。
    • 称我为愚蠢,但我在您的回答中没有看到脚本。但我确实发现,如果我手动更改 .hgsubstate 文件,它会非常好用——其他用户在拉取和更新时会自动拉取子存储库。太好了,我只是手动编辑它。 差不多了
    • 啊,都是加号开头的行,就是sh -x的输出。每当您在父存储库中提交或在子存储库中更新时,应该会更新 .hgsubstate。在我的示例中,当 lib 的初始克隆发生时,它会获取其初始值(子存储库的提示)。
    • 哇,我只需要手动克隆子存储库即可将其从 00000000000000000000000000000000000000 子状态中删除。我没有意识到这是一个步骤。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 2013-01-15
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    相关资源
    最近更新 更多