我正在尝试设置Mercurial存储库系统以与多个子存储库一起使用。我基本上已经遵循these instructions来使用Mercurial client 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
根据我对文档的解释,这应该有效:
同样,
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