🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!

Перенос 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 .

Теперь имеем 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.

Buy me a coffee Понравился пост? Купи мне кофе