Выбрать главу

Subversion

Если прочли предыдущий раздел об использовании git svn, вы можете с лёгкостью использовать все инструкции, имеющиеся там для клонирования репозитория через git svn clone. Затем можете отказаться от использования сервера Subversion и отправлять изменения на новый Git-сервер, и использовать уже его. Вытащить историю изменений, можно так же быстро, как получить данные с сервера Subversion (что, однако, может занять какое-то время).

Однако, импортирование не будет безупречным. И так как оно занимает много времени, стоит сделать его правильно. Первая проблема это информация об авторах. В Subversion каждый коммитер имеет свою учётную запись в системе, и его имя пользователя отображается в информации о коммите. В примерах из предыдущего раздела выводилось schacon в некоторых местах, например, в выводе команд blame и git svn log. Если вы хотите преобразовать эту информацию для лучшего соответствия данным об авторах в Git, вам потребуется отобразить пользователей Subversion в авторов в Git. Создайте файл users.txt, в котором будут содержаться данные об этом отображении в таком формате:

schacon = Scott Chacon <schacon@geemail.com> selse = Someo Nelse <selse@geemail.com>

Для того, чтобы получить список авторов, который использует SVN, вы можете выполнить следующее:

$ svn log --xml | grep author | sort -u | perl -pe 's/.>(.?)<./$1 = /'

Это даст вам на выходе журнал в формате XML — в нём вы можете просмотреть информацию об авторах, создать из неё список с уникальными записями и избавиться от XML разметки. (Конечно, эта команда сработает только на машине с установленными grep, sort, и perl). Затем перенаправьте вывод этого скрипта в свой файл users.txt, чтобы потом можно было добавить к каждой записи данные о соответствующих пользователях из Git.

Вы можете передать этот файл как параметр команде git svn, для более точного преобразования данных об авторах. Кроме того, можно дать указание git svn не включать метаданные, обычно импортируемые Subversion, передав параметр --no-metadata команде clone или init. Таким образом, команда для импортирования будет выглядеть так:

$ git-svn clone http://my-project.googlecode.com/svn/ \ --authors-file=users.txt --no-metadata -s my_project

Теперь в вашем каталоге my_project будут находиться более приятно выглядящие данные после импортирования. Вместо коммитов, которые выглядят так:

commit 37efa680e8473b615de980fa935944215428a35a Author: schacon <schacon@4c93b258-373f-11de-be05-5f7a86268029> Date: Sun May 3 00:12:22 2009 +0000 fixed install - go to trunk git-svn-id: https://my-project.googlecode.com/svn/trunk@94 4c93b258-373f-11de- be05-5f7a86268029

они будут выглядеть так:

commit 03a8785f44c8ea5cdb0e8834b7c8e6c469be2ff2 Author: Scott Chacon <schacon@geemail.com> Date: Sun May 3 00:12:22 2009 +0000 fixed install - go to trunk

Теперь не только поле Author выглядит намного лучше, но и строк с git-svn-id больше нет.

Вам потребуется сделать небольшую «уборку» после импорта. Сначала вам нужно убрать странные ссылки, оставленные git svn. Сначала мы переставим все метки так, чтобы они были реальными метками, а не странными удалёнными ветками. А затем мы переместим остальные ветки так, чтобы они стали локальными.

Для приведения меток к корректному виду меток Git выполните:

$ cp -Rf .git/refs/remotes/tags/* .git/refs/tags/ $ rm -Rf .git/refs/remotes/tags

Эти действия переместят ссылки, которые были удалёнными ветками, начинающимися с tag/ и сделают их настоящими (легковесными) метками.

Затем, переместите остальные ссылки в refs/remotes так, чтобы они стали локальными ветками:

$ cp -Rf .git/refs/remotes/* .git/refs/heads/ $ rm -Rf .git/refs/remotes

Теперь все старые ветки стали реальными Git-ветками, а все старые метки — реальными метками Git. Последнее, что осталось сделать, это добавить свой Git-сервер в качестве удалённого ресурса и отправить на него данные. Вот пример добавления сервера как удалённого источника:

$ git remote add origin git@my-git-server:myrepository.git

Так как вы хотите, чтобы все ваши ветви и метки были переданы на этот сервер, выполните:

$ git push origin --all

Теперь все ваши ветки и метки должны быть импортированы на новый Git-сервер в чистом и опрятном виде.

Perforce

Следующей системой, для которой мы рассмотрим процедуру импортирования, будет Perforce. Утилита импортирования для Perforce также входит в состав Git, но только в секции contrib исходного кода — она не доступна по умолчанию, как git svn. Для того, чтобы запустить её, вам потребуется получить исходный код Git, располагающийся на git.kernel.org:

$ git clone git://git.kernel.org/pub/scm/git/git.git $ cd git/contrib/fast-import

В каталоге fast-import вы найдёте исполняемый скрипт Python, с названием git-p4. Вы должны иметь на вашем компьютере установленный Python и утилиту p4 для того, чтобы эта утилита смогла работать. Допустим, например, что вы импортируете проект Jam из Perforce Public Depot. Для настройки вашей клиентской машины, вы должны установить переменную окружения P4PORT, указывающую на депо Perforce: