Ртутный из Subversion:перемещает, переименовывает и помечает тегами

StackOverflow https://stackoverflow.com/questions/1329806

Вопрос

У меня есть репозиторий 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 на данный момент.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top