Перенос SVN-репозитария в git
July 22, 2009 , revised February 14, 2016 in SoftwareВсе вокруг уже используют Git, а твои репозитарии все еще используют Subversion. Не все потеряно - перенести репозитарии можно и автоматически, и с сохранением всей истории изменений.
Устанавливаем git-svn
Это, собственно, часть гита, так что достать ее можно без проблем. Например, на Ubuntu это делается так:
sudo apt-get install git-svn
А на Mac OS X эта утилита есть из коробки.
Собираем авторов коммитов
В SVN коммиты подписываются просто идентификаторами пользователей, а в Git - и-мейлами. Поэтому придется составить файл-словарь имейлов всех пользователей.
Выполняем такой вот скрипт в папке SVN-репозитария:
#!/usr/bin/env bash
authors=$(svn log -q | grep -e '^r' | awk 'BEGIN { FS = "|" } ; { print $2 }' | sort | uniq)
for author in ${authors}; do
echo "${author} = NAME <EMAIL>";
done
Результат работы скрипта сохраняем куда-нибудь в ~/svn-authors
, не забывая заполнить реальные адреса.
Клонируем репозитарий
Указываем URL репозитария, а НЕ транка!
git svn clone --stdlayout --preserve-empty-dirs --authors-file=/home/user/svn-authors svn://repo/location .
--stdlayout
– понимать стандартные папки SVN (trunk, branches, tags)--preserve-empty-dirs
– поскольку Git не отслеживает папки, а только файлы, то по умолчанию в склонированном репозитарии не будет пустых папок из SVN. С этой опцией в пустой папке будет создан файл.gitignore
, благодаря чему папка будет закоммичена.--authors-file=...
– использовать файл с авторами с предыдущего шага
Теперь имеем git-репозитарий с содержимым SVN.
Разбираемся с ветками
Вытягиваем удаленные ветки в локальный репозитарий.
git fetch . refs/remotes/*:refs/heads/*
Вытягиваем svn:ignore
Для каждой ветки:
git checkout branch
git svn create-ignore
git commit -a -m "imported svn:ignore"
Вычищаем из репозитария упоминания об SVN
Наконец, мы готовы отдать проект в руки git. Разумеется, репозитарий SVN как был, так и остался, поскольку работаем мы с локальной копией. Но в дальнейшем планируется использовать только git, можно убрать из репозитария данные git-svn.
Удаляем все svn-ветки - те, которые git считает удаленными (remote). Кроме того, удаляем ту ветку, которая является мастером; практика показывает, что это самая свежая ветка. Еще можно удалить мастер, а потом переименовать самую свежую ветку в мастер.
for branch in `git branch -r`; do git branch -rd $branch; done
git branch -d trunk
Последний штрих: удаляем метаданные git-svn
git config --remove-section svn-remote.svn
rm -Rf .git/svn/
Готово! Имеем полностью перенесенный под Git репозитарий. Можно пользоваться им сразу, а можно залить на GitHub, собственную копию GitLab или просто на любой сервер, доступный по SSH.
Понравился пост? Купи мне кофе