Я пытаюсь настроить систему репозитория 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
этого репо даст 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
работает отлично. Конечно, это в основном то же самое, что не использовать подпункты.
Ни одна из команд Mercurial не возвращает коды ошибок (кроме pull
изнутри src/mylib
), поэтому она явно полагает, что ведет себя правильно (и вполне может быть), хотя это не кажется логичным.
Что я делаю не так?
Основная проблема может заключаться в том, что .hgsubstate
всегда будет выглядеть так:
0000000000000000000000000000000000000000 src/mylib
Но я понятия не имею, как это исправить ...