SVN to Git использует быстрый поток импорта / экспорта

Я работал над преобразованием репозитория SVN ~32 000 коммитов в любой DVCS (Git, Bazaar, Mercurial, Plastic SCM). Через неделю или две я понял, что лучший вариант - преобразовать репозиторий SVN в Git, получить поток быстрого экспорта и импортировать поток.fe в любую DVCS, поскольку все они поддерживают метод быстрого экспорта / импорта git.

Я перепробовал все в интернете: как на Windows 7, так и на Linux Ubuntu. Из-за размера репо у меня был наибольший успех при использовании reposurgeon и git-svn. Но опять же, из-за размера, оба инструмента не могут полностью скрыть репо за один раз. Я также попробовал SubGit, и хотя он работает, он очень медленный (~24 часа для обработки 1060 коммитов).

Поэтому я решил, что смогу конвертировать каждую папку в репозитории (ствол, ветви, теги, пользовательские папки) по отдельности и объединить позже в Git. Тогда я понял, что это невозможно, поскольку структура репозитория git значительно отличается от SVN.

У меня вопрос, возможно ли использовать мой метод выше и с некоторой магией объединить отдельные преобразования в одно Git-репо?

По сути, мне нужно получить быстрый поток экспорта / импорта для моего репозитория SVN, чтобы преобразовать его в другой DVCS, и я подумал, что промежуточный шаг Git будет проще всего. Какие, если таковые имеются, другие варианты доступны для успешного преобразования?

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

2 ответа

Решение

Конвертирование папок по отдельности и объединение репозиториев git должно работать в принципе, но было бы очень сложно получить правильное решение, поэтому я бы посоветовал против этого.

Во всяком случае, 32 000 коммитов это не так много, и git-svn должен быть в состоянии справиться с этим, хотя это может занять день или около того. Однако, если это будет слишком медленно, вам придется немного поэкспериментировать.

Вещи, которые могут замедлить работу клона git-svn

Скорость репозитория SVN

Во-первых, это скорость хранилища SVN. Попробуйте создать локальное зеркало репозитория SVN (используя svnadmin dump/load или же svnsync), и клонировать это.

"Подкаталог" ветки / теги

Ветви или теги (которые git обрабатывает одинаково) могут стать проблемой. Всякий раз, когда git-svn clone встречает ветку SVN, которая не является копией транка, но подкаталога, она будет перечитывать всю историю SVN разветвленного подкаталога с момента его создания (вы можете увидеть это в выходных данных git svn cloneи вот объяснение автора). Это означает, что скорость клона не только пропорциональна количеству ревизий SVN n, но и по количеству "веток подкаталогов" bт.е. если b = 10, клон может занять до 10 раз дольше.

Нет простого решения этой проблемы. Во-первых, вы можете попробовать клонировать без тегов - обычно тег просто возвращается к идентификатору ревизии SVN, поэтому достаточно иметь список тегов (если у вас нет тегов, которые содержат изменения... тьфу). Если этого недостаточно, возможно, также пропустите несколько веток... хотя вам придется решить, есть ли что-то, без чего вы можете обойтись.

Экстремальное решение будет использовать вариант --no-follow-parent, Это предотвратит git svn перечитав ветку с самого начала. Ветви все равно будут читаться, однако они не будут связаны с остальной частью истории. Это все еще показывает вам, что там было сделано, но сильно затрудняет их объединение.


Наконец, обратите внимание, что вы можете прервать и возобновить процесс клонирования. Чтобы возобновить, запустите git svn fetch, Вам может потребоваться несколько перезапусков, но с небольшим терпением клон должен пройти.

Воскрешение очень старого вопроса, но я подумал, что ответ может быть полезным для кого-то.

Возможно, вы захотите попробовать https://github.com/svn-all-fast-export/svn2git. Несколько лет назад я конвертировал старое репозиторий SVN с ~35k коммитами в Git, а также разделил его на несколько отдельных репозиториев Git. У меня была локальная копия репозитория SVN на моем ноутбуке, и это заняло всего около 15 минут (что было здорово, так как мне пришлось многократно выполнять преобразование, прежде чем я был достаточно доволен результатом;). Я также использовал BFG Repo-Cleaner для постобработки конвертированных репозиториев Git.

svn-all-fast-export / svn2git - не самое прямолинейное из всех программ, мне пришлось несколько раз прочитать исходный код, чтобы действительно понять, что происходит. Возможно, вы захотите проверить мой другой ответ на эту тему, чтобы получить несколько советов: svn-all-fast-export: Совпадение имен файлов

Другие вопросы по тегам