Mercurial Remote Subrepos - PullRequest
       16

Mercurial Remote Subrepos

4 голосов
/ 03 апреля 2010

Я пытаюсь настроить систему репозитория 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

Но я понятия не имею, как это исправить ...

1 Ответ

3 голосов
/ 03 апреля 2010

Путь с левой стороны в файле .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
...