Одна из главных достопримечательностей 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 и:
- Добавьте ваш новый репозиторий GitHub в качестве удаленного:
1
$ git remote add origin git@my-git-server:myrepository.git
Если вы получаете сообщение об ошибке « Фатально: удаленный источник уже существует », вместо этого выполните следующее:
1$ git remote
set
-url origin git@my-git-server:myrepository.git
- Нажмите код к нему:
010203040506070809101112131415
$ 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 в хорошем, чистом импорте.
Счастливого нажатия!