Заставить ртутные субхранилища вести себя как внешние субверсии

FAQ и hginit.com были действительно полезны, поскольку помогли мне перейти с svn на hg.

Однако, когда дело доходит до использования функции подхранилища Hg в качестве внешних элементов Subversion, я пробовал все и не могу воспроизвести хорошее поведение svn externals.

Вот простейший пример того, что я хочу сделать:

  1. Инициализировать репозиторий "lib" Этот репозиторий никогда не должен использоваться как автономный; он всегда включается в основные репозитории как вспомогательный репозиторий.

  2. Инициируйте один или несколько репозиториев, включая репозиторий. Чтобы не усложнять пример, я «инициализирую» репозиторий под названием «main».

  3. Попросите "main" включить "lib" в качестве подрепозитория

  4. Важно - И ВОТ ЧТО Я НЕ МОГУ НАЧАТЬ РАБОТАТЬ: когда я изменяю файл внутри «main / lib» и нажимаю модификацию, это изменение помещается в репозиторий «lib», а НЕ в копию. внутри «основного».

Командные строки говорят громче, чем слова. Я перепробовал столько вариаций на эту тему, но вот суть. Если кто-то сможет ответить в командной строке, я буду вечно благодарен!

1. Запустить репозиторий "lib"

$ cd / home / moi / hgrepos ## Где я храню свои репозитории hg, на моем основном сервере

$ hg init lib

$ echo "foo"> lib / lib.txt

$ hg добавить библиотеку

$ hg ci -A -m "Init lib" lib

2. Запустите «главный» репозиторий и включите «lib» в качестве подрепозитория.

$ cd / home / moi / hgrepos

$ hg init main

$ echo "foo"> main / main.txt

$ hg добавить основную

$ cd main

$ hg clone ../lib lib

$ echo "lib = lib"> .hgsub

$ hg ci -A -m "Инициировать главную".

Все это работает нормально, но когда я делаю клон «основного» репозитория и делаю локальные изменения в файлах в «main / lib» и нажимаю их, изменения переносятся в «main / lib», а НЕ в «lib». ".

В COMMAND-LINE-ESE ЭТО ПРОБЛЕМА:

$ / home / moi / hg-test

$ hg clone ssh: //[email protected]/hgrepos/lib lib

$ hg clone ssh: //[email protected]/hgrepos/main main

$ cd main

$ echo foo >> lib / lib.txt

$ hg st

M lib.txt

$ hg com -m "Измененный lib.txt из основных репозиториев" lib.txt

$ hg push

отправка на ssh: //[email protected]/hgrepos/main/lib

Последняя строка вывода hg показывает проблему.

Это показывает, что я внес изменения в КОПИЮ файла в lib, а НЕ в файл в репозитории lib. Если бы это работало так, как я бы хотел, чтобы он работал, толчок был бы в hgrepos / lib, а НЕ в hgrepos / main / lib. То есть я бы увидел:

$ hg push

отправка на ssh: //[email protected]/hgrepos/lib

ЕСЛИ ВЫ МОЖЕТЕ ОТВЕТИТЬ НА ЭТО УСЛОВИЯ

КОМАНДНЫХ СТРОК, А НЕ НА АНГЛИЙСКОМ ЯЗЫКЕ,

БУДУ ВЕЧНО БЛАГОДАРНЫ!

Заранее спасибо!

Эмили в Портленде


person Emily Dickinson    schedule 03.04.2010    source источник
comment
Эмили, я рада, что это сработало. Как насчет выбора моего ответа? Это обычная награда за время, потраченное на помощь здесь, на SO. Ваши изменения ответа обычно входят либо в мой комментарий, либо в редактирование «Обновить» вашего вопроса, а не в сам ответ.   -  person Ry4an Brase    schedule 04.04.2010
comment
И на самом деле, глядя на ваши инструкции ssh: //, вы слишком много над этим задумываетесь. После выполнения моих шагов по настройке локальной настройки субрепо, вы можете просто клонировать «основное» репо по ssh, и mercurial создаст всю настройку main / lib на удаленном репо, выполняя оба действия. Это реальное обещание подрепо - один клон дает вам несколько вложенных репозиториев.   -  person Ry4an Brase    schedule 04.04.2010


Ответы (2)


Проблема в вашем файле .hgsub. Он указывает на то, где находится репозиторий lib, поэтому, если lib является родственником main, он должен быть:

lib=../lib

Также ваши строки hg add lib и hg add main не имеют смысла. К какому репо, помимо main и lib, они добавляются? Вы запускаете их в /home/moi/hgrepos.

Вот ваш сценарий с некоторыми настройками:

+ cd /home/ry4an/hgtest
+ hg init lib
+ echo foo
+ cd lib
+ hg commit -A -m Init lib
adding lib.txt
+ cd /home/ry4an/hgtest
+ hg init main
+ echo foo
+ cd main
+ echo lib=../lib
+ hg clone ../lib
destination directory: lib
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ hg add .hgsub main.txt
+ hg commit -m Init main: initial file and a .hgsub
committing subrepository lib
+ cd /home/ry4an/hgtest
+ hg clone main main-clone
updating to branch default
pulling subrepo lib
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ cd main-clone
+ echo foo
+ hg commit -m Modified lib.txt, from inside the main repos
committing subrepository lib
+ hg push
pushing to /home/ry4an/hgtest/main
pushing subrepo lib
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files

Чтобы сделать это через ssh: //, вам нужно сделать всего одно изменение. При клонировании основного репо измените hg clone main main-clone на hg clone ssh://host/hgtest/main main-clone - клонирование основного репо автоматически клонирует библиотеку - это преимущество подрепо.

Вот журнал этой работы:

+ cd /home/ry4an/hgtest
+ hg init lib
+ echo foo
+ cd lib
+ hg commit -A -m Init lib
adding lib.txt
+ cd /home/ry4an/hgtest
+ hg init main
+ echo foo
+ cd main
+ echo lib=../lib
+ hg clone ../lib
destination directory: lib
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ hg add .hgsub main.txt
+ hg commit -m Init main: initial file and a .hgsub
committing subrepository lib
+ cd /home/ry4an/hgtest
+ hg clone ssh://localhost/hgtest/main main-clone
The authenticity of host 'localhost (::1)' can't be established.
RSA key fingerprint is 0c:58:d6:d3:d3:16:14:ee:3b:be:01:bc:c7:3c:92:0b.
Are you sure you want to continue connecting (yes/no)? yes
ry4an@localhost's password: 
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 3 changes to 3 files
updating to branch default
pulling subrepo lib
ry4an@localhost's password: 
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
3 files updated, 0 files merged, 0 files removed, 0 files unresolved
remote: Warning: Permanently added 'localhost' (RSA) to the list of known hosts.
+ cd main-clone
+ echo foo
+ hg commit -m Modified lib.txt, from inside the main repos
committing subrepository lib
+ hg push
ry4an@localhost's password: 
pushing to ssh://localhost/hgtest/main
pushing subrepo lib
ry4an@localhost's password: 
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 1 changesets with 1 changes to 1 files
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 1 changesets with 1 changes to 1 files
person Ry4an Brase    schedule 03.04.2010

Упс, извините за форматирование в предыдущем ответе. Вот оно опять отформатировано!

Итак, вот два сценария, с которыми столкнется большинство людей:

A) Использование субхранилищ в полностью локальной ситуации. По сути, это решение Райана. Я предполагаю, что в этой лодке будут только разработчики, работающие в одиночку.

    cd /home/moi/hgrepos
    hg init lib
    cd lib
    echo foo > lib.txt
    hg ci -A -m Init

    cd /home/moi/hgrepos
    hg init main
    cd main
    echo foo > main.txt
    echo lib = ../lib > .hgsub
    hg clone ../lib
    hg add .hgsub main.txt
    hg ci -m Init

    cd /home/moi/hgrepos
    hg clone main main-clone
    cd main-clone/lib
    echo "Modified while on main trunk" >>lib.txt
    hg commit -m "Modified lib.txt, while on main trunk"
    hg push
    cd /home/moi/hgrepos/lib
    hg update
    1 files updated, 0 files merged, 0 files removed, 0 files unresolved

    cat lib.txt
    foo
    Modified while on main trunk

-----------------------------------------------------------------

Б) Использование суб-репозиториев по ssh.
Я полагаю, что большинство разработчиков, работающих в командах, попадут в эту лодку.

1) Настроить библиотеку

cd /home/moi/hgrepos
hg init lib
cd lib
echo foo > lib.txt
hg ci -A -m Init

2) Настроить основной

cd /home/moi/hgrepos
hg init main
cd main
echo foo > main.txt
echo lib=ssh://[email protected]/hgrepos/lib > .hgsub
hg clone ssh://[email protected]/hgrepos/lib lib
hg add .hgsub main.txt
hg ci -m Init

3) Клонировать библиотеку в каталог hgtest

cd /home/moi/hgtest
hg clone ssh://[email protected]/hgrepos/lib lib

4) Клонировать главную в hgtest dir

cd /home/moi/hgtest
hg clone ssh://[email protected]/hgrepos/main main

5) Измените lib.txt на главном стволе

cd /home/moi/hgtest/main/lib
echo "Modified while on main trunk" >>lib.txt
hg commit -m "Modified lib.txt, while on main trunk"
hg push

6) Убедитесь, что lib.txt был изменен в репозитории lib.

cd /home/moi/hgtest/lib
hg pull
hg update
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
cat lib.txt
foo
Modified while on main trunk
person Community    schedule 03.04.2010