Доброго времени суток!
Данная статья посвящена одной небольшой задачке – переносу репозитория вместе со всей историей с одной системы управления версиями в другую, а точнее – в SVN. Речь пойдёт об использовании бесплатной утилиты Importer for SVN от Palarion, с помощью которой можно мигрировать с CVS / PCVS / VSS / ClearCase / StarTeam / MKS на SVN, не потеряв при этом журнала изменений кода. В моём случае потребовалось перенести проекты из Borland StarTeam.
Почему было сказано «нет» StarTeam и «да» SVN? Сначала думал пропустить данный абзац во избежание холиваров. Но, пожалуй, без этого статья была бы лишена, скажем так, области определения. В моём случае отказаться от StarTeam вынудил уход человека, его внедрившего и администрировавшего. Пара дней безуспешных попыток заставить работать сервис под другой учётной записью породили мысль о том, что задача восстановления репозиториев из бэкапов станет ещё большим вызовом. Конечно, радиус кривизны рук можно было значительно увеличить спустя какое-то время. Но оно нам надо, спрашивается, когда есть бесплатный, до безобразия лёгкий в установке и поддержке SVN? Тем более что у меня было предостаточно опыта его использования на предыдущих местах работы, а все два с половиной разработчика находятся в одной комнате.
Одно препятствие – жаль было терять историю изменений. Сначала думали залить в SVN текущие версии, а историю смотреть в StarTeam, переведя его предварительно в read-only. Но, как говорится, это не наш метод. И непродолжительный гуглопоиск навёл на выше в суе помянутый Palarion Importer for SVN.
Теперь непосредственно к сути. Имеем репозиторий в CVS / PCVS / VSS / ClearCase / StarTeam / MKS (с паролями и всеми доступами). Требуется его перенести в новый репозиторий в SVN.
Замечание 1: Судя по опциям в конфиге, существует возможность залития данных в уже существующий репозиторий, но я её не проверял.
Общий план действий:
0. Проверка системных требований.
1. Скачиваем утилиту.
2. Настраиваем общие параметры.
3. Настраиваем секцию SVN.
4. Настраиваем секцию VCS-источника.
5. Запуск утилиты.
0. Проверка системных требований
Из всех системных требований – установленная и настроенная JRE (т.к. утилита написана на Java) на той машине, где будет работать утилита. С этой машины должны быть доступны и источник, и приёмник.
В моём случае серверы и StarTeam, и SVN крутятся на одной машине, т.ч. для меня выбор был очевиден.
1. Скачиваем утилиту
Здесь по ссылке «Download» слева от основного текста. Сразу после указания имени/компании/e-mail начнется закачка. Никакого запроса на подтверждение на мыло не приходит, но есть проверка существования адреса. Затем просто распаковываем zip-архив на целевую машину.
2. Настраиваем общие параметры
В файле config.properties:
srcprovider=st
Это самое главное – источник данных. Здесь – StarTeam.
import_dump_into_svn=yes
Можно создать только дамп-файл(ы) – для этого ставим здесь no. Например, если возникают какие-то ошибки именно на стадии импорта в SVN (см. раздел «Выявленные проблемы»).
existing_svnrepos=yes
clear_svn_parent_dir=yes
По идее с помощью этих параметров можно залить в уже существующий репозиторий. Не пробовал. Я создавал локально новый репозиторий, а потом импортировал его на сервер с помощью удобного интерфейса.
3. Настраиваем секцию SVN
В файле же config.properties:
svnimporter_user_name=login
Я задействовал свой доменный (AD) логин. Но, сдается мне, можно любой указать.
svnadmin.executable=c:/Program Files/VisualSVN Server/bin/svnadmin.exe
Да. Я использую VisualSVN. Кому не нравится, прописывает путь к другому серверу.
svnadmin.repository_path=D:/SvnRepositories/Repository1
Как ни парадоксально, но это место расположения репозитория SVN.
svnadmin.parent_dir=.
Папка внутри SVN-репозитория. В данном случае – корневая.
svnadmin.tempdir=c:/temp/svnlocal
Временная помойка.
svnclient.executable=c:/Program Files/VisualSVN Server/bin/svn.exe
Вы не поверите…
svnadmin.verbose_exec=yes
В лог будет писаться подробная информация о ходе процесса.
Ещё есть файл config.autoprops. Там указаны MIME- типы и свойства для отдельных расширений файлов. Мне «заводских» настроек хватило за уши. Кому мало – может подсмотреть, например, здесь.
4. Настраиваем секцию VCS-источника
Для каждой из поддерживаемых VCS всё в том же config.properties есть отдельная секция. Камменты помогают понять что зачем.
В случае StarTeam указываем строку соединения (внутри вида можно также указывать отдельные папки):
st.url=LOGIN:PWD@SRV-NAME:49201/Project/View
st.tempdir=c:/temp/starteamtemp
Замечание 2: Пробовал задействовать параметры st.includes.regex/ st.excludes.regex, но так и не постиг тайны их формата (что такое RegEx я знаю, но к какой части URL он применяется, серия экспериментов ясности не дала). Пытался писать на их форум, но ответа не получил.
5. Запуск утилиты
Ну, вот – можно жать потными ручками красную кнопку. Для этого запускаем svnimporter.jar (для виндовз-пользователя уже заботливо приготовлен файл run.bat, где он передается JVM) и передаем ему 2 параметра:
%1 – команда. В нашем случае это full. Возможные варианты: list, incr.
%2 – наш поправленный выше конфиг: config.properties.
Т.е. как-то так:
SET JAVA_OPTS=-Xmx192m
java %JAVA_OPTS% -jar svnimporter.jar full config.properties
Замечание 3. Из известных мне команд есть ещё list для проверки корректности настроек экспорта/импорта.
Замечание 4. Есть ещё инкрементальный дамп, но в данной статье эта тема не раскрывается, хотя она может быть полезна тем, кто захочет синхронизировать две VCS на регулярной основе (по расписанию).
Критерий успешности
После завершения работы утилиты смотрим в журнал history.log и ищем сакраментальную строчку «successfully finished». Если её нет, то смотрим в svnimporter.log на предмет ошибки и устраняем оную.
Выявленные проблемы:
1. У меня утилита ругалась, что не может найти каких-то борландо-стартимовских классов. Я кинул в папку lib библиотеку starteam80.jar, которую я взял из места установки моего StarTeam Server 2005. Возможно, нужно было просто настроить переменные среды для Java.
2. На 3-м заходе возникли проблемы при импорте в SVN. Утилита ругалась на недопустимый символ UTF-8. Не знаю, кривизна ли это утилиты или у меня в хранилище битая версия была. В общем варианты решения:
- задействовать st.includes.regex/ st.excludes.regex, чтобы пропустить проблемный файл, но, как я писал выше, мне удалось понять, как они работают (см. шаг 4).
- убить проблемный файл в репозитории-источнике.
- Создать только dump-файлы без импорта в SVN (см. шаг 2), hex-редактором поправить в дампе битый код и ручками залить dump-файлы в SVN — с помощью svnadmin.exe.
Автор: neru