Заставить ртутные субпозитории вести себя как внешние диверсии - PullRequest
6 голосов
/ 03 апреля 2010

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

Однако, когда дело доходит до использования функции репозитория Hg в духе внешних действий subversion, я пробовал все и не могу воспроизвести хорошее поведение внешних SVN.

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

  1. Init "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 add lib

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

2. Инициируйте "главный" репозиторий и включите "lib" в качестве подпункта

$ cd / home / moi / hgrepos

$ hg init main

$ echo "foo"> main / main.txt

$ hg add main

$ 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: //moi@www.moi.com/hgrepos/lib lib

$ hg clone ssh: //moi@www.moi.com/hgrepos/main main

$ cd main

$ echo foo >> lib / lib.txt

$ рт.ст.

M lib.txt

$ hg com -m "Модифицированный lib.txt из основных репозиториев" lib.txt

$ рт.ст. push

отправка в ssh: //moi@www.moi.com/hgrepos/main/lib

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

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

$ hg push

отправка в ssh: //moi@www.moi.com/hgrepos/lib

ЕСЛИ ВЫ МОЖЕТЕ ОТВЕТИТЬ НА ЭТО СРОКИ

командных строк больше, чем на английском

Я буду ВЕЧНО БЛАГОДАРЕН!

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

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

Ответы [ 2 ]

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

Проблема с вашим файлом .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
1 голос
/ 03 апреля 2010

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

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

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

    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

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

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

1) Настроить lib

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://moi@www.moi.com/hgrepos/lib > .hgsub
hg clone ssh://moi@www.moi.com/hgrepos/lib lib
hg add .hgsub main.txt
hg ci -m Init

3) Клонировать lib в hgtest dir

cd /home/moi/hgtest
hg clone ssh://moi@www.moi.com/hgrepos/lib lib

4) Клонирование главного в hgtest dir

cd /home/moi/hgtest
hg clone ssh://moi@www.moi.com/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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...