Skip to content

Latest commit

 

History

History
executable file
·
129 lines (97 loc) · 7.62 KB

import-svn.asc

File metadata and controls

executable file
·
129 lines (97 loc) · 7.62 KB

Subversion

Якщо ви прочитали попередню секцію про використання 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 гарно, чисто імпортовані.