Ртутный из Subversion:перемещает, переименовывает и помечает тегами
-
19-09-2019 - |
Вопрос
У меня есть репозиторий subversion со следующим макетом:
svnrepo/projectA/trunk
svnrepo/projectA/tags
svnrepo/projectA/branches
svnrepo/projectB/trunk
svnrepo/projectB/tags
svnrepo/projectB/branches
который я хотел бы перенести в репозиторий mercurial с пересмотренным макетом:
hgrepo/Проект
hgrepo/Проект b
Каков наилучший способ сделать это?Вот некоторые из моих мыслей:
Вариант 1
Измените порядок путей в subversion (используя svn move) в промежуточный формат:
svnrepo/trunk/projectA
svnrepo/trunk/projectB
svnrepo/tags/projectA
svnrepo/tags/projectB
svnrepo/branches/projectA
svnrepo/branches/projectB
затем hg преобразуется в svnrepo / trunk.Не приведет ли это к путанице при импорте ртути?
Вариант 2 hg преобразует каждый из проектов / магистралей в отдельные репозитории hg.Затем объедините их в одно репозиторий hg (используя hg init, hg pull -f ProjectA и т.д.).Я думаю, что при этом будут потеряны названия ветвей и теги в первом импортированном проекте.
Решение
В Mercurial хранение несвязанных кодовых баз в одном репозитории - плохая идея, потому что это приведет к
- Значительно усложняют слияние.Слияния будут зависеть от изменений, внесенных в ВСЕ проекты, а не только тот проект, который вы пытаетесь объединить.
- Вызывают накладные расходы на хранение и проверку - Mercurial, насколько я знаю, не поддерживает проверку только подкаталогов репозитория.Вам пришлось бы разветвлять все проекты одновременно.
Решение состоит в том, чтобы преобразовать ваш единственный репозиторий Subversion в несколько репозиториев Mercurial.Большинство инструментов преобразования поддерживают это.
Другие советы
Каждый проект должен находиться в своем собственном репозитории Hg (чтобы иметь возможность получить или пометить только определенный проект).
Помните, что каталог, который вы видите в Subversion (магистраль, теги, ветви), не будет существовать ни в одном современном (D) VCS, где ветви и теги являются гражданами первого класса (т.Е.метаданные, непосредственно управляемые инструментом), в отличие от простого каталога, получаемого в результате дешевая копия (в SVN).
Это означает, что когда вы конвертируете репозиторий SVN, вы не должны хранить напрямую какой-либо каталог "trunk", "tags" или "branches" в истории репозитория Hg.
Вам лучше использовать инструмент, подобный hgsubversion
чтобы импортировать ваше SVN-репозиторий (например, просто "repo / ProjectA") в репозиторий Hg, посвященный ProjectA.он сохранит теги и ветви исходного проекта SVN и преобразует их в объекты Hg.
От его документация:
Все обновления с использованием
hgpullsvn
создаются в ветви, названной по последнему компоненту SVN URL (например, если SVN URL являетсяsvn://server/myproj/branches/feature-ZZZ
,hgpullsvn
создаст и будет использовать именованную ветвь 'feature-ZZZ
')
Если вы хотите не "конвертировать", а "синхронизировать", тонфа рекомендовать hgsubversion
, хотя в настоящее время он "находится в постоянном состоянии из-за интенсивного рефакторинга".:
Прямо сейчас это так нет готов к использованию в производстве.Вам следует использовать это только в том случае, если вы готовы взломать его и погрузиться во внутренности Mercurial и / или Subversion.
С тех пор как hgsvn
также разрешите некоторую синхронизацию через hgpushsvn
и hgpullsvn
...Я бы придерживался hgsvn
на данный момент.