Клонирование нестандартного хранилища Svn с помощью Git-Svn - PullRequest
37 голосов
/ 21 февраля 2009

Я относительно новичок в Git, но мне так легко работать дома, что я бы хотел использовать его на работе, где наши проекты хранятся в репозиториях Svn. К сожалению, репозитории немного нестандартны, и у меня возникают проблемы с их клонированием. Конечно, у них у всех есть ствол, ветви / и теги /, но ветви / и теги / имеют подкаталоги до попадания в каталоги real проекта:

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 ]

35 голосов
/ 21 февраля 2009

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

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

13 голосов
/ 21 февраля 2009

Не могли бы вы попробовать svn2git nirvdrum (кажется самым современным), чтобы импортировать svn в репозиторий git?
(В начале 2009 года Пол упомянул об этом 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.

9 голосов
/ 24 мая 2011

Для макетов репо, не обслуживаемых обычными подстановочными знаками: (от мой ответ до этот связанный вопрос )

Текущая страница 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/*
...