Одна из главных достопримечательностей GitHub — это сообщество и инструментальные средства, которые позволяют этому сообществу делиться кодом. Каждый участник может клонировать репозиторий, внести свои изменения и затем отправить вам запрос на извлечение . В качестве сопровождающего проекта ваша работа теперь стала намного проще и более управляемой. Нет больше файлов патчей для беспокойства.
Следуйте приведенному ниже рецепту, чтобы переместить репозиторий SVN в Git .
Лучше всего то, что вы сохраняете всю историю коммитов вашего проекта.
Git данные автора
Первым шагом является создание текстового файла, отображающего пользователей SVN в авторов Git. Формат такой:
|
1
|
samaxes = Samuel Santos <samaxes@example.com> |
Чтобы получить список имен авторов, которые использует 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"; doneDeleted 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"; doneDeleted remote branch trunk (was e4b45d8). |
Теперь у нас есть все теги и ветки локально:
|
1
2
3
4
5
6
|
$ git tagv1.0$ git branch* master trunk |
Тем не менее, локальная ветвь trunk избыточна с нашей master веткой Git и должна быть удалена:
|
1
2
|
$ git branch -d trunkDeleted branch trunk (was e4b45d8). |
Нажмите код для GitHub
Теперь все старые ветки — это настоящие Git-ветки, а все старые теги — это настоящие Git-тэги, пришло время отправить код в GitHub. Для этого создайте свой новый репозиторий на GitHub и:
- Добавьте ваш новый репозиторий GitHub в качестве удаленного:
1
$ git remote add origin git@my-git-server:myrepository.gitЕсли вы получаете сообщение об ошибке « Фатально: удаленный источник уже существует », вместо этого выполните следующее:
1$ git remoteset-url origin git@my-git-server:myrepository.git - Нажмите код к нему:
010203040506070809101112131415
$ git push origin --allCounting 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.git78ffd8f..f50e329 master -> master$ git push origin --tagsCounting 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 в хорошем, чистом импорте.
Счастливого нажатия!