Mercurial Remote Subrepos
Я пытаюсь настроить систему репозитория Mercurial для работы с несколькими подпунктами. Я в основном следовал этим инструкциям, чтобы настроить клиентское репо с 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
Это должно работать, согласно моей интерпретации документации:
Первый "вложенный" - это путь в нашем рабочем каталоге, а второй - это 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
Но я понятия не имею, как это исправить...
1 ответ
Путь левой стороны в вашем .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://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