2009-02-21 5 views
37

Я относительно новичок в Git, но мне было так легко работать дома, что я хотел бы использовать его на работе, где хранятся наши проекты в репозиториях Svn. К сожалению, репозитории немного нестандартны, и у меня возникают проблемы с их клонированием. Конечно, все они имеют ствол, ветви/и теги /, но ветви/и/теги имеют подкаталоги до попадания реальных каталогов проекта:Клонирование нестандартного хранилища 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; как я уже упоминал, я все еще довольно новый. Я едва поцарапал поверхность своих возможностей.

ответ

34

Lee B был прав. Ответ, предоставленный 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 

Именно то, что мне нужно. Спасибо за понимание, все.

+0

+1 для опции глубокого клонирования – VonC

13

Не могли бы вы попробовать nirvdrum's svn2git (кажется, самый современный), чтобы импортировать ваш svn в репозиторий git?
(Early 2009, Paul упомянул об этом iteman's svn2git в замене этого original jcoglan's svn2git, который был, как уже упоминалось его автор: «быстрый хак, чтобы получить код из подрывных»)

Это лучше, чем 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-native local branch и git tag objects.
Таким образом, после импорта этого проекта, вы получите:

$ 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 (также present there)

Идея остаются:

  • SVN на работу в качестве центрального хранилища.

  • Git «в другом месте», чтобы быстро экспериментировать между несколькими филиалами Git-private.

  • импорт назад только сводные ветви Git в официальные филиалы SVN.

+0

Я видел этот комментарий на другой пост, который был похож на мою проблему. К сожалению, я не думаю, что это сработает (хотя я обязательно посмотрю на svn2git). Мне нужно напрямую взаимодействовать с репозиториями Svn. Есть другие члены команды, которые не готовы к Git. –

+0

+1 - У меня были подобные проблемы, когда я изучал git, пока я не создал новое репо с использованием svn2git, и проблемы исчезли. Более современную версию можно найти по адресу http://github.com/iteman/svn2git/tree/master. – Paul

+0

@VonC - Как перезапустить клон, если он был прерван из-за недоступности сети? – notionquest

9

Для макетов репо, не обслуживаемые равнинных символы: (от my answer до this related question)

current 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/* 
+0

Я выполнил ваши шаги и получил 1 тег, перенесенный. Я хотел бы повторить то же самое для следующих двух тегов. Я попытался добавить третий тег {1.0.2.0, 3.0} и выполнить git svn fetch. Но он не извлекает ничего из репо. Я что-то пропустил? – notionquest

Смежные вопросы