Клонирование нестандартного хранилища Svn с помощью Git-Svn
Я относительно новичок в Git, но мне так легко работать дома, что я бы хотел использовать его на работе, где наши проекты хранятся в репозиториях Svn. К сожалению, репозитории немного нестандартны, и у меня возникают проблемы с их клонированием. Конечно, все они имеют транк, ветки / и теги /, но ветки / и теги / имеют подкаталоги до попадания в реальные каталоги проекта:
trunk/
branches/maintenance/release1
branches/maintenance/release2
...
branches/development/feature1
branches/development/feature2
...
tags/build/build1
tags/build/build2
...
tags/release/release1
tags/release/release2
После клонирования:
$ git svn clone -s --prefix=svn/ https://mydomain.com/svnproject
$ git branch -r
development
development@1340
maintenance
maintenance@1340
tags/build
tags/build@1340
tags/release
tags/release@1340
trunk
trunk@1340
Я не получаю ни одной фактической ветки проекта или тегов. На самом деле мне нужно уметь работать в магистрали, в одной ветке обслуживания и в одной ветке разработки. Я пробовал этот подход в дополнение к нескольким взломам при изменении конфигурации, но у меня ничего не работает.
Есть ли способ, как я могу поместить ключевые компоненты моего нестандартного проекта Svn в локальный репозиторий git, чтобы я мог легко перемещаться между ними?
Большое спасибо.
ОБНОВЛЕНИЕ: я должен добавить, что я не могу сделать оптовый переход на Git (пока). Вовлечены другие члены команды и международное присутствие. Логистика перехода - это больше, чем я готов предпринять, пока я не почувствую себя намного лучше с Git; как я уже говорил, я все еще довольно новый. Я едва поцарапал поверхность его возможностей.
3 ответа
Ли Би был прав. Ответ, предоставленный doener в #git, заключается в обновлении Git до 1.6.x (я использовал 1.5.x). 1.6.x предлагает глубокое клонирование, так что с --branches
опция:
$ git svn clone https://svn.myrepos.com/myproject web-self-serve \
--trunk=trunk --branches=branches/*/* --prefix=svn/
$ git branch -r
svn/development/sandbox1
svn/development/feature1
svn/development/sandbox2
svn/development/sandbox3
svn/development/model-associations
svn/maintenance/version1.0.0
svn/trunk
Именно то, что мне было нужно. Спасибо за понимание, все.
Не могли бы вы попробовать svn2git от nirvdrum (кажется, самый современный), чтобы импортировать svn в репозиторий git?
(В начале 2009 года Paul упомянул svn2git этого итератора вместо svn2git этого оригинального jcoglan, который, как отметил его автор: "быстрый взлом, чтобы вытащить мой код из Subversion")
Это лучше чем git svn clone
потому что если у вас есть этот код в SVN:
trunk
...
branches
1.x
2.x
tags
1.0.0
1.0.1
1.0.2
1.1.0
2.0.0
git-svn
будет проходить историю коммитов для создания нового репозитория git.
Он будет импортировать все ветки и теги как удаленные ветви svn, тогда как вам действительно нужны локальные ветки git и объекты тегов git.
Поэтому после импорта этого проекта вы получите:
$ git branch
* master
$ git branch -a
* master
1.x
2.x
tags/1.0.0
tags/1.0.1
tags/1.0.2
tags/1.1.0
tags/2.0.0
trunk
$ git tag -l
[ empty ]
После того, как svn2git завершит работу с вашим проектом, вы получите следующее:
$ git branch
* master
1.x
2.x
$ git tag -l
1.0.0
1.0.1
1.0.2
1.1.0
2.0.0
Конечно, это решение не предназначено для поездки в один конец.
Вы всегда можете вернуться в свой svn-репозиторий с помощью... git2svn (также присутствует там)
Идея остается:
SVN на работе в качестве центрального хранилища.
Git "в другом месте", чтобы быстро экспериментировать среди множества Git-частных веток.
импортировать обратно только консолидированные ветки Git в официальные ветки SVN.
Для макетов репо, не обслуживаемых обычными подстановочными знаками: (из моего ответа на этот связанный вопрос)
Текущая страница руководства git-svn гласит:
Также можно извлечь подмножество ветвей или тегов, используя разделенный запятыми список имен в фигурных скобках. Например:
[svn-remote "huge-project"]
url = http://server.org/svn
fetch = trunk/src:refs/remotes/trunk
branches = branches/{red,green}/src:refs/remotes/branches/*
tags = tags/{1.0,2.0}/src:refs/remotes/tags/*