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
Другие вопросы по тегам