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

bash
  1. sudo apt-get install git-svn

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

bash
  1. cd ~/workspace/someproject/
  2. git-svn clone https://svn.example.com/repos/someproject/trunk/ .
  3. git svn rebase
  4. 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

bash
  1. git --version

Если так, то командуем
bash
  1. git branch -a
который должен вывести что-то наподобие

* master
remotes/git-svn

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

Командуем:

bash
  1. git rebase --onto remotes/git-svn --root master

И вуаля:

bash
  1. git-svn dcommit
работает!! Коммиты пошли отправляться в SVN.

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

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

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

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

5 комментариев to Импорт GIT репозитория в пустой SVN

  1. 18.01.2010 at 13:27 | #

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

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

  2. 18.01.2010 at 13:28 | #

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

  3. 19.01.2010 at 12:14 | #

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

Оставить комментарий

Вы можете использовать следующие HTML теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>