Клонирование нестандартного репозитория 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
[email protected]
maintenance
[email protected]
tags/build
tags/[email protected]
tags/release
tags/[email protected]
trunk
[email protected]
Я не получаю никаких фактических ветвей или тегов проекта. Мне действительно нужно иметь возможность работать на багажнике, одной ветки обслуживания и одной ветки разработки. Я пробовал этот подход в дополнение к нескольким хакам при изменении конфигурации, но для меня ничего не работает.
Есть ли способ получить ключевые компоненты моего нестандартного проекта Svn в локальном репозитории git, чтобы я мог легко перемещаться между ними?
Большое спасибо.
ОБНОВЛЕНИЕ: я должен добавить, что я не могу использовать опционный переключатель на git (пока). Есть и другие участники команды и международное присутствие. Логистика перехода - это больше, чем я готов взять на себя, пока мне будет гораздо удобнее Git; как я уже упоминал, я все еще довольно новый. Я едва поцарапал поверхность своих возможностей.
Ответы
Ответ 1
Ли Б был прав. Ответ, полученный с помощью 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
Именно то, что мне нужно. Спасибо за понимание, все.
Ответ 2
Не могли бы вы попробовать nirvdrum svn2git (кажется, самый современный), чтобы импортировать ваши svn в репозиторий git?
(В начале 2009 года Paul упоминалось об этом iteman svn2git взамен этого оригинального jcoglan svn2git, который, как сказал его автор," быстро взломал, чтобы получить код
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.
Ответ 3
Для макетов репо, не обслуживаемых обычными подстановочными знаками: (от мой ответ до этот связанный вопрос)
текущая git -svn manpage говорит:
Можно также получить подмножество ветвей или тегов с помощью список имен, разделенных запятыми брекеты. Например:
[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/*