FAQ и hginit.com были действительно полезны для помощи мне сделать переход от svn до hg.
Однако когда дело доходит до использования функции подрепозитория Hg манерой внешних пользователей подверсии, я попробовал все и не могу копировать хорошее поведение svn внешнего облика.
Вот самый простой пример того, что я хочу сделать:
Репозиторий "lib" Init Этот репозиторий никогда не должен использоваться в качестве автономного; это всегда включается основными репозиториями как подрепозиторий.
Init одни или несколько включая репозитории Для хранения примера простым я буду "init" репозиторий, названный "основным"
Имейте "основной", включают "lib" как подрепозиторий
Значительно - И ВОТ то, ЧТО я не МОГУ ВЗЯТЬСЯ ЗА РАБОТУ: Когда я изменяю файл в "основном / lib", и я продвигаю модификацию, затем то изменение продвинуто в репозиторий "lib" - НЕ к копии в "основном".
Командные строки говорят громче, чем слова. Я попробовал столько вариаций на эту тему, но вот суть. Если кто-то может ответить в командных строках, я буду навсегда благодарен!
CD $/home/moi/hgrepos ##, Где я храню свои hg репозитории на моем основном сервере
$ hg init lib
$ повторяют "нечто"> lib/lib.txt
$ hg добавляют lib
$ hg ci-A-m "lib" lib Init
CD $/home/moi/hgrepos
$ hg init основной
$ повторяют "нечто"> main/main.txt
$ hg добавляют основной
Основной CD $
$ hg клонируют../освобождаем lib
$ повторяют "lib=lib"> .hgsub
$ hg ci-A-m "основной Init".
Это все хорошо работает, но когда я делаю клон "основного" репозитория, и делаю локальные модификации в файлы в "основном / lib" и продвигаю их, изменения продвинуты к "основному / lib", НЕ к "lib".
$/home/moi/hg-test
$ hg клонируют ssh://moi@www.moi.com/hgrepos/lib lib
$ hg клонируют ssh://moi@www.moi.com/hgrepos/main основной
Основной CD $
$ повторяют нечто>> lib/lib.txt
$ hg Св.
M lib.txt
$ hg com-m "Измененный lib.txt, из основного repos" lib.txt
$ hg нажатие
Это показывает, что я сделал модификацию к КОПИИ файла в lib, НЕ в файл в репозитории lib. Если бы это работало, поскольку я хотел бы, чтобы это работало, нажатие было бы к hgrepos/lib, НЕ к hgrepos/main/lib. Т.е. я видел бы:
$ hg нажатие
продвижение к ssh://moi@www.moi.com/hgrepos/lib
Заранее спасибо!
Emily в Портленде
Проблема в вашем файле .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
- клонирование основного автоматически клонирует lib - это выгода субрепо.
Вот протокол этой работы:
+ 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
К сожалению, извините за форматирование в предыдущем ответе. Вот оно опять отформатировано!
Итак, вот два сценария, с которыми столкнется большинство людей:
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) Настроить lib
cd /home/moi/hgrepos
hg init lib
cd lib
echo foo > lib.txt
hg ci -A -m Init
2) Настроить main
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) Клонировать main в 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