Статьи

Миграция из хранилища Subversion в GitHub

Одна из главных достопримечательностей GitHub — это сообщество и инструментальные средства, которые позволяют этому сообществу делиться кодом. Каждый участник может клонировать репозиторий, внести свои изменения и затем отправить вам запрос на извлечение . В качестве сопровождающего проекта ваша работа теперь стала намного проще и более управляемой. Нет больше файлов патчей для беспокойства.

Следуйте приведенному ниже рецепту, чтобы переместить репозиторий SVN в Git .
Лучше всего то, что вы сохраняете всю историю коммитов вашего проекта.

Git данные автора

Первым шагом является создание текстового файла, отображающего пользователей SVN в авторов Git. Формат такой:

1
samaxes = Samuel Santos <[email protected]>

Чтобы получить список имен авторов, которые использует SVN, вы можете запустить это (в OSX параметр grep для регулярного выражения вместо -P -e ):

1
$ svn log --xml | grep -P "^<author" | sort -u | perl -pe 's/<author>(.*?)<\/author>/$1 = /' > authors.txt

Замечания:

Если командная строка не для вас, и вы переходите из репозитория SourceForge Subversion, используйте код в FindSVNCommitters.java вместе с инструментом резервного копирования SourceForge: rsync, чтобы получить полный список имен авторов.

Создайте репозиторий Git

Затем создайте новый Git-репозиторий для вашего проекта. Пока это будет локальный репозиторий, поэтому пока не нужно беспокоиться о GitHub:

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

Заметки:

Без опции --no-metadata git svn добавляет ссылку на номер редакции SVN в каждое сообщение журнала.
Если git svn встречает имя git svn SVN, которого нет в authors-file , git svn прервет операцию.

Очистить ссылки SVN

Исходный клон импортирует все, включая ветки и теги SVN, однако локально доступна только master ветка:

1
2
$ git branch
* master

Связанные с svn ветви и теги — это фактически удаленные ветви в Git:

1
2
3
$ git branch -r
  tags/v1.0
  trunk

Итак, чтобы теги были правильными, используйте Git:

1
2
$ git for-each-ref refs/remotes/tags | cut -d / -f 4- | grep -v @ | while read tagname; do git tag "$tagname" "tags/$tagname"; git branch -r -d "tags/$tagname"; done
Deleted remote branch tags/v1.0 (was 539f804).

И переместите остальные ссылки в refs/remotes в локальные ветви:

1
2
$ git for-each-ref refs/remotes | cut -d / -f 3- | grep -v @ | while read branchname; do git branch "$branchname" "refs/remotes/$branchname"; git branch -r -d "$branchname"; done
Deleted remote branch trunk (was e4b45d8).

Теперь у нас есть все теги и ветки локально:

1
2
3
4
5
6
$ git tag
v1.0
 
$ git branch
* master
  trunk

Тем не менее, локальная ветвь trunk избыточна с нашей master веткой Git и должна быть удалена:

1
2
$ git branch -d trunk
Deleted branch trunk (was e4b45d8).

Нажмите код для GitHub

Теперь все старые ветки — это настоящие Git-ветки, а все старые теги — это настоящие Git-тэги, пришло время отправить код в GitHub. Для этого создайте свой новый репозиторий на GitHub и:

  1. Добавьте ваш новый репозиторий GitHub в качестве удаленного:
    1
    $ git remote add origin git@my-git-server:myrepository.git

    Если вы получаете сообщение об ошибке « Фатально: удаленный источник уже существует », вместо этого выполните следующее:

    1
    $ git remote set-url origin git@my-git-server:myrepository.git
  2. Нажмите код к нему:
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    $ git push origin --all
    Counting objects: 32, done.
    Delta compression using up to 2 threads.
    Compressing objects: 100% (24/24), done.
    Writing objects: 100% (31/31), 10.85 KiB | 0 bytes/s, done.
    Total 31 (delta 6), reused 0 (delta 0)
    To git@my-git-server:myrepository.git
       78ffd8f..f50e329  master -> master
     
    $ git push origin --tags
    Counting objects: 1, done.
    Writing objects: 100% (1/1), 219 bytes | 0 bytes/s, done.
    Total 1 (delta 0), reused 0 (delta 0)
    To git@my-git-server:myrepository.git
     * [new tag]         v1.0 -> v1.0

Все ваши ветки и теги должны быть в вашем новом репозитории GitHub в хорошем, чистом импорте.

Счастливого нажатия!

Ссылка: Миграция из репозитория Subversion в GitHub от нашего партнера JCG Сэмюэля Сантоса в блоге Samaxes .