Якщо ви прочитали попередню секцію про використання git svn
, то можете легко використати ті інструкції, щоб git svn clone
репозиторій; потім, припиніть користуватися сервером Subversion, надішліть все до нового сервера Git, та почніть ним користуватись.
Якщо вам потрібна історія, то можете швидко цього досягнути, з такою ж швидкістю, як можете дістати дані зі сервера Subversion (що може зайняти деякий час).
Втім, імпортування не бездоганне: і через те, що процес займає так багато часу, варто одразу зробити його правильно.
Першою проблемою є інформація про авторів.
У Subversion, кожна особа, яка створює коміти, має користувача в системі, якого записано в інформації коміту.
Приклади з попередньої секції показують schacon
у деяких місцях, як і вивід blame
та git svn log
.
Якщо ви бажаєте відобразити це в кращі дані про автора Git, вам потрібно відображення користувачів Subversion в авторів Git.
Створіть файл під назвою users.txt
, який містить це відображення в такому форматі:
schacon = Scott Chacon <[email protected]>
selse = Someo Nelse <[email protected]>
Щоб отримати список імен авторів, які використовує SVN, ви можете виконати наступне:
$ svn log --xml --quiet | 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
(хоча якщо ви бажаєте зберегти метадані синхронізації, спокійно приберіть цей параметр).
Тоді команда import
виглядатиме так:
$ git svn clone http://my-project.googlecode.com/svn/ \
--authors-file=users.txt --no-metadata --prefix "" -s my_project
$ cd my_project
Тепер у вас буде ліпший імпорт Subversion у директорії 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 <[email protected]>
Date: Sun May 3 00:12:22 2009 +0000
fixed install - go to trunk
Не лише поле з автором виглядає набагато краще, а й більше немає git-svn-id
.
Також варто трохи прибрати після імпортування.
По-перше, треба вичистити дивні посилання, які налаштував git svn
.
Спершу, ми перемістимо теґи, щоб вони стали справжніми теґами, а не дивними віддаленими гілками, а потім перемістимо решту гілок, щоб вони стали локальними.
Щоб перемістити теґи до належних теґів Git, виконайте:
$ for t in $(git for-each-ref --format='%(refname:short)' refs/remotes/tags); do git tag ${t/tags\//} $t && git branch -D -r $t; done
Це бере посилання, які були віддаленими гілками, що починались з refs/remotes/tags/
та перетворює їх на справжні (легкі) теґи.
Далі, перемістіть решту посилань під refs/remotes
до локальних гілок:
$ for b in $(git for-each-ref --format='%(refname:short)' refs/remotes); do git branch $b refs/remotes/$b && git branch -D -r $b; done
Може так статися, що ви побачите якісь зайві гілки з наростками @xxx
(де xxx — число), хоча в Subversion ви бачите лише одну гілку.
Насправді це функціонал Subversion під назвою `peg-revisions'' для якого в Git просто немає синтаксичного відповідника.
Отже, `git svn
просто додає номер версії svn до імʼя гілки саме так, як би ви написали його в svn, щоб звернутися до peg-revision цієї гілки.
Якщо вам начхати на ці peg-revisions, просто вилучите їх:
$ for p in $(git for-each-ref --format='%(refname:short)' | grep @); do git branch -D $p; done
Тепер усі старі гілки стали справжніми гілками Git, та всі старі теґи стали справжніми теґами Git.
Залишилось прибрати єдину річ.
На жаль, git svn
створює додаткову гілку trunk
, яка відповідає типовій гілці Subversion, проте посилання trunk
вказує туди ж, куди й master
.
Оскільки master
більш традиційний для Git, ось як вилучити зайву гілку:
$ git branch -d trunk
Залишилось лише додати новий сервер Git як віддалене сховище та надіслати до нього. Ось приклад додавання сервера як віддаленого:
$ git remote add origin git@my-git-server:myrepository.git
Оскільки ви бажаєте надіслати всі гілки та теґи, то можете виконати наступне:
$ git push origin --all
$ git push origin --tags
Усі ваші гілки та теґи мають бути на новому сервері Git гарно, чисто імпортовані.