Как справиться с нестандартными импорт из Subversion на Git
У нас есть нестандартный subversion respository, который мы хотели бы преобразовать в Git. Проблема в том, что я действительно не знаю, с чего начать, чтобы убедиться, что мы сохраняем полную историю, но не заканчиваем полным беспорядком.
Наш репозиторий имеет последние 6 лет истории для набора продуктов наших компаний и прошел через многочисленные реструктуризации. Во всех случаях у нас есть кодовая база базовой платформы, а затем несколько проектов / плагинов, которые объединяются различными способами поверх ядра платформа.
Первые два года были структурированы следующим образом:
-- plugin1
- trunk
- branches
- tags
-- pluginX
- trunk
- branches
- tags
-- trunk (core platform)
- <various sub dirs)
-- branches (various feature branches of the entire repository)
- refactoring1
- refactoringX
-- tags (various tags of customer releases of full respository)
- customerX_1.x
-- vendor (vendor drops and tracking of 3rd party source deps)
- 3rd_party_code_A
- 3rd_party_code_X
Со временем мы добавили еще пару каталогов корня в том числе:
-- releases (replaced tags; branches for released stable versions of repos)
-- sandbox (area for misc projects of interest; should have been new repo)
Затем мы очистили это и в итоге получили:
-- trunk
- platform
- plugin1
- pluginX
-- stable (stable release branches of trunk)
- 1.1
- 1.2
-- tags (release points; marks a point on a stable branch)
- 1.1.1
- 1.1.2
-- vendor
-- sandbox
-- releases (copies of old releases of interest)
Такова наша история. То, что мы хотим в конечном итоге получить, надеюсь, намного чище. Сейчас мы думаем о том, что база репозитория git выглядит следующим образом (в основном копия предыдущего каталога "trunk").
- platform
- plugin1
- pluginX
Branches:
- stable/1.1
- stable/1.2
Tags:
- rel/1.1.1
- rel/1.1.2
Мы хотели бы поставить песочницу и поставщик в свои собственные хранилища. (не знаю, как это сделать, но, возможно, есть способ импортировать только подмножество репозитория svn)
Насколько ответвления и метки, мы бы хотели, чтобы код со "стабильного" до конца вверх, а ветви, код 'теги' в конечном итоге как теги на "стабильный".
Для более старой истории из исходной структуры мы хотели бы сохранить как можно больше истории, но не хотим загрязнять новое хранилище. Например, если бы мы могли оглянуться назад и увидеть изменения это произошло на ветвях рефакторинга, что было бы здорово, но не обязательно.
В настоящее время мы обсуждаем, как действовать дальше и как все реструктурировать и импортировать чистым способом. Самое меньшее, что нам нужно, - это способ иметь полную историю платформы и кода плагина в обеих предыдущих соответствующих реструктуризациях. Если возможно, мы также хотели бы получить стабильную информацию и информацию о тегах из самой последней структуры репозитория.
Есть ли у кого-нибудь рекомендации о том, как сделать этот импорт?
Например:
- возможно ли сохранить полную историю всех реструктуризаций?
- должны ли мы каким-то образом переписать репозиторий subversion, чтобы очистить его перед импортом, и если да, то как?
- должны ли мы импортировать полную историю, а затем реструктурировать ее в Git, и как это сделать?
- Есть идеи, как сделать этот импорт чистым?
1 ответ:
В зависимости от вашей ситуации git-svn (с опцией по умолчанию
Однако у вас могут возникнуть проблемы со сложной историей структуры каталогов.--follow-parent) может просто сделать трюк как есть. Первое, что вы должны сделать, это попробовать несколько git-svn запусков, тщательно прописывая-T,-b, и-tопции, чтобы помочь ему со структурой каталогов.Недавно я был в очень похожей ситуации, перенося Субверсионный код моей компании в git, куда ушла история SVN через очень похожую реструктуризацию к тому, что вы описываете. В моем случае я также хотел разделить проекты из одного репозитория Subversion на несколько репозиториев Git (по одному на проект).
Я смог выбрать легкий путь, решив, что не критично мигрировать больше, чем на несколько месяцев истории, поэтому для каждого проекта я определил, какая самая ранняя ревизия была, что git-svn может обрабатывать изящно, а затем только извлек историю, начиная оттуда (используяgit-svn -r). Имея дело с предыдущими миграциями VCS (VSS to SVN, 2005), я знал по опыту, что долгосрочная история почти никогда не упоминается. В любом случае, легко оставить старый сервер Subversion работающим (в режиме только для чтения), так что он может быть использован для поиска вещей, если это необходимо.Я не знаю никакого простого способа очистить историю Subversion , кроме использования
svndumpfilterдля исключения некоторых ее частей. Однако, если Вам ПОВЕЗЕТ, git-svn волшебным образом сделает все правильно, и история на самом деле будет выглядеть чище вgit log, чем когда-либо вsvn log(из-за разницы в том, как git смотрит на ветви и теги).В общем, чистота иполнота истории-это две противоречивые цели при осуществлении миграции такого рода. К счастью, они оба действительно переоценены - они оба апеллируют к нашему эстетическому чувству больше, чем к прагматическим потребностям.
EDIT: боковой совет для чистоты: используйте опцию
--prefixна git-svn, чтобы дать импортированные ветви имеют уникальный префикс, так как в git, скорее всего, у вас будут разные соглашения о ветвлении, и это облегчает просмотр истории svn позже.
Comments