Блог - Linux, программирование, Я!

ПрограммированиеИмпорт GIT репозитория в пустой SVN

В статье кратко описано как импортировать существующий GIT репозиторий в чистенький SVN со всей историей коммитов и пр.

Первый вопрос, который напрашивается – ЗАЧЕМ?

Отвечаю – просто проект разрабатывался в моем локальном репозитории, а после заказчик попросил разместить его в SVN. Можно, конечно, сделать это все одним большим Initial коммитом, но хочется чтоб история тоже импортировалась. Так вот, допустим имеется SVN репозиторий https://svn.example.com/repos/someproject/ со стандартной иерархией

https://svn.example.com/repos/someproject/

----/trunk

----/tags

----/branches

и локальный git репозиторий ~/workspace/someproject/ в котором находятся папочки

~/workspace/someproject/

----/.git

----/lib

----/config

----/…..

И мы хотим в SVN получить структуру

https://svn.example.com/repos/someproject/ trunk/

----/lib

----/config

----/…..

Для работы с SVN из GIT устанавливаем пакет git-svn

sudo apt-get install git-svn

Если делать по стандартной инструкции

cd ~/workspace/someproject/
git-svn clone https://svn.example.com/repos/someproject/trunk/ .
git svn rebase
git-svn dcommit

То появляется ошибка

Use of uninitialized value in concatenation (.) or string at /usr/bin/git-svn line 411.

Committing to …


Unable to determine upstream SVN information from HEAD history

Для исправления положения, после этой попытки, делаем следующее:

Убеждаемся, что версия GIT не ниже, чем 1.6.3

git --version

Если так, то командуем

git branch -a

который должен вывести что-то наподобие

* master

remotes/git-svn

Обратим внимание на строку remotes/git-svn (может отличаться)

Командуем:

git rebase --onto 
remotes/git-svn --root master

И вуаля:

git-svn dcommit

работает!! Коммиты пошли отправляться в SVN.

Если теперь выполнить

git log

То в каждом коммите будет дополнительно строка типа git-svn-id: https://svn.example.com/repos/someproject/trunk@49 78ca4877-544d-4e5c-8d06-6abf935*****

Еще раз, все команды по-порядку:

cd ~/workspace/someproject/ #переходим в папку проекта (в которой находится папка .git)
git-svn clone https://svn.example.com/repos/someproject/trunk/ . #"копируем" SVN репозиторий (на сам. деле при этом соответствующим образом конфигурируется GIT
git branch -a #смотрим название ветки remotes/blablabla
git rebase --onto remotes/git-svn --root master # remotes/git-svn берем из предыдущей команды
git-svn dcommit # копируем GIT репозиторий в SVN со всей историей коммитов и пр.
  1. 2010-01-18 13:27:40 | #

    Спасибо, очень полезно :)

    Просмотри еще раз вставки кода, например, в "git –version" на сколько я понимаю "–" быть не должно, а должно быть "–" и т.д.

  2. 2010-01-18 13:28:58 | #

    блин… порезало все… имелось ввиду – & # 8 2 1 1 ; (без пробелов конечно)

    • 2010-01-19 07:53:55 | #

      Да, есть у вордпресса такая фишка как типограф, который два тире превращает в дефис… Пока не смотрел как отключить, но в ближайшее время попробую

    • 2010-01-19 11:12:28 | #

      Да, поправил…

      Пришлось в коде покопаться((

      На всякий случай, в текущей версии WordPress 2.9.1 чтобы — не заменялся на – & # 8 2 1 1 ; нужно в файле wp-includes/formatting.php в переменных $static_characters и $static_replacements удалить соответствующие элементы массивов

  3. 2010-01-19 12:14:02 | #

    Вот теперь красота :)

    Еще раз спасибо за статью :)

  4. 2010-07-30 11:29:10 | #

    Побольше б таких постов на блоге.