Узелки на память...

13.02.2010

svn -> git

Сегодня решил мигрировать репозиторий с svn на git. Кому не показалась интересной первая строка повествования, (дальше лучше не читать).

Дано: Windows XP, svn 1.6.2, git version 1.6.5.1.1367.gcd48 (msys).

Задача: смигрировать svn-репозиторий в git без потери истории.

Классический алгоритм:

1. Создаём мап-файл (например, на десктопе) с именами комиттеров (users.txt):

jmaddox = Jon Maddox <jon@gmail.com>
bigpappa = Brian Biggs <bigpappa@gmail.com>

2. Ранаем по очереди следующие команды:

> mkdir dev_temp
> cd dev_temp
> git svn init http://code.yoursite.net/dev1/trunk/ --no-metadata
> git config svn.authorsfile ~/Desktop/users.txt
> git svn fetch

тут всё просто:

1-2 строки - создаём новый каталог для временного репозитория.
3 - инициализирует каталог как гибридный git-svn и указывает origin на исходный репозиторий.
4 - ремапит имена комиттеров
5 - собственно, фетч

После некоторого ожидания можно проверить, что пользователи смапились корректно (git log). Затем нужно склонировать этот временный репозиторий (git clone) в новый "чистый", чтобы избавиться от svn-хвоста для поддержки git-svn.

> git clone dev_tmp dev1

Собственно, всё.

Вариации таковы: зачастую (например, при домашней разработке) svn репозиторий располагается в файловой системе (где-нибудь на другом диске). Тогда шаг 3 меняется так:

> git svn init file:///E:/svn_rep/dev_repository --no-metadata

Далее, при попытке фетча получаем что-то типа: ... Expected FS format '2'; found format '4' ... (c вариациями). Различные версии svn поддерживают разные форматы репозитория (чем больше версия, тем больше формат). Данное сообщение указывает на то, что msysgit пытается читать репозиторий формата 2 (svn 1.4.x), а находит формат 4 (svn 1.5.x - ...), т.е. репозиторий создан в svn более поздней версии, чем используется в msysgit. Выход - передампить svn-репозиторий в более ранний формат с помощью svnadmin:

> cd /path/to/svn/repos
> mv dev_repository dev_repository.old
> svnadmin create --pre-1.4-compatible dev_repository
> svnadmin dump dev_repository.old | svnadmin load dev_repository

Фетчим - начинается засос ревизий, но после первой обламываемся с ошибкой: ... Permission denied: Can't open '/tmp/report.tmp' ...

Даже после конверсии репозитория в формат более ранней версии msysgit не может его читать. В этом на выручку приходит svnserve. После установки и настройки оного к нашему svn-репозиторию уже можно обращаться по протоколу svn://

> git svn init svn://localhost/dev1 --no-metadata

Фетчим - вуаля! git аккуратно перекачивает все коммиты и мапит их на новые имена пользователей.