it-swarm.com.ru

Как перенести код из SVN в GIT без потери истории коммитов?

Я хотел бы знать рекомендуемый способ переместить наш код из репозитория SVN в репозиторий GIT, чтобы мы перевели нашу команду разработчиков и начали использовать GIT.

Можем ли мы выполнить переход и сохранить все коммиты, сделанные в репозитории SVN?

Кроме того, наша команда в настоящее время довольна SVN, но они не знают, что ветвление в GIT намного проще, чем SVN, где я могу найти практический пример, который доказывает мощь GIT в ветвлении?

70
simo

Эрик Рэймонд (esr) создал reposurgeon , "интерпретатор команд для выполнения сложных операций редактирования в истории контроля версий". Инструмент включает сценарии для различных целей, включая очистку результатов преобразований VCS. Проверьте это с https://gitlab.com/esr/reposurgeon .

Начиная с версии 2.0 он включает в себя поддержку чтения дамп-файлов SVN для полного и идиоматического перевода в Git, Mercurial, и т.д. ; смотрите http://esr.ibiblio.org/?p=4071 для подробностей. Reposurgeon использовался для преобразования нескольких крупных проектов в Git, в том числе Emacs, репозиторий которого, по словам ESR, "является большим, сложным по структуре ветвей и достаточно старым, чтобы начать жизнь как репозиторий CVS. Эта последняя часть имеет значение, потому что некоторые из самых уродливых проблем перевода, скрывающихся в истории прошлого проектов Subversion, - это странные последовательности операций Subversion (включая комбинации операций копирования веток), сгенерированные cvs2svn ".

(Инструмент git-svn, включенный в Git, будет обрабатывать многие репозитории Subversion, включая ветки. Он довольно часто используется, особенно командами, которые находятся в процессе преобразования, поскольку он позволяет Git вести себя как клиент Subversion. Но посмотрите ESR Не делайте svn-to-git преобразования репозитория с помощью git-svn! , где он обсуждает недостатки git- SVN в качестве инструмента преобразования.)

Относительно вашего второго вопроса, это не ветвление, где сила Git так полезна (хотя Git, по крайней мере, так же силен, как Subversion в этом отношении); когда речь идет о слиянии тех веток, которые светит Git. Прочитайте Git Community Book , особенно раздел в главе 3 под названием " Основное ветвление и объединение " и раздел в главе 7 под названием " Расширенное объединение знак равно.

47
J. C. Salomon

Поскольку уже есть много людей, работающих с git-svn , я бы сказал, что это очень возможно. Следующая команда довольно хорошо известна:

git svn clone -s http://svn/repo

Согласно руководство (проверено локально), это сохранит "ствол, теги и ветви".

18
l0b0

Обновление апрель 2014

Существует инструмент под названием Svn2Git , который довольно неплохо делает этот процесс немного проще. Документация по проекту Github довольно хорошая. ( Требуется Ruby )

Стоит отметить, что в то время как git-svn по умолчанию использует только выбранный вами путь, а не ветви, теги и транк. Svn2git это наоборот. По умолчанию он ищет ствол, ветви и теги по пути, и вы должны использовать --nobranches или --notags, чтобы запретить их поиск (хотя это может свести на нет преимущества svn2git).


Как только вы перейдете в Git, я предлагаю вам переместить всех и продолжать использовать Git. Это сложнее, но переход будет стоить того. Github.com поддерживает доступ к репо с помощью клиента Subversion (но вы можете потерять силу ветвления Git), и это может быть хорошим временным интервалом.

Могу ли я сохранить свой репозиторий Subversion?

Когда вы используете приведенный ниже метод для перемещения, все текущие коммиты останутся в репозитории Subversion. Возможно, вы сможете выполнить одностороннюю синхронизацию репозитория Subversion с репозиторием Git, но другой путь очень быстро усложняется. Я не рекомендовал бы пытаться синхронизировать так или иначе и просто переместить всех один раз.

Что хорошего в Git?

Git-ветвление мощно, но это еще не все, что есть в Git. Наличие полной истории локально означает, что вы можете делать все, что вы можете делать с Subversion, но без необходимости обращаться к серверу. Просмотр и поиск в истории, отмена изменений, фиксация локально, ветвление локально становятся чрезвычайно быстрыми. Git также сжимает свои данные, поэтому извлечение Subversion (которое включает в себя только самую последнюю ревизию) заканчивается примерно таким же размером, что и извлечение Git (которое включает в себя полную историю). Кроме того, поскольку при сжатии данные сжимаются, перемещение и извлечение также выполняются намного быстрее. Не просто нажимайте на ветки Git, помещайте все о Git.

Как переместить репо с помощью метода git svn.

Сначала клонируем репозиторий Subversion. Это может занять некоторое время.

git svn clone http://www.example.com/svn-repo/projectA/trunk/

Где http://www.example.com/svn-repo/ - это URL-адрес хранилища Subversion, а projectA/trunk/ - это путь, который вы хотите скопировать в Git.

Если у вас есть стандартная раскладка, такая как projectA/trunk, projectA/branches/ и projectA/tags/, вы можете добавить --stdlayout и клонировать из каталога вверх, как это

git svn clone --stdlayout http://www.example.com/svn-repo/projectA/  projectA.git-svn

И, если у вас есть ствол, папка и теги, имена которых отличаются от указанных выше, вы можете назначить для каждого git svn clone собственные имена.

git svn clone --trunk my-trunk --branches my-branches --tags my-tags http://www.example.com/svn-repo/projectA/  projectA.git-svn

Как только это завершится, все, что вам нужно сделать, это нажать на удаленное git-репо с --mirror.

cd projectA.git-svn
git Push --mirror [email protected]:Account/projectA.git

На этом этапе вы должны сделать репозиторий Subversion доступным только для чтения, чтобы люди не пытались совершить транзакцию в устаревшее местоположение.

11
Nate

Репо можно полностью преобразовать, включая теги и все ветви, используя git svn clone.

Есть некоторые тонкие настройки, чтобы получить правильные теги, смотрите эта ссылка для получения дополнительной информации.

Эта тема была рассмотрена здесь в SO хотя бы один раз:
Как импортировать svn-ветки и теги в git-svn?

5
eckes

Безопасный и плавный переход с Svn на Git заключается в использовании SubGit - серверного средства синхронизации Git/Svn. Можно установить SubGit в хранилище Subversion и продолжать использовать Subversion и Git одновременно до тех пор, пока продолжается процесс миграции.

Отказ от ответственности: я разработчик SubGit, который счастливо использует SubGit в течение полугода.

2
Alexander Kitaev

Джон Альбин написал несколько хороших сценариев здесь и здесь , которые сделают все преобразования за вас (включая преобразование автора). Скрипты не идеальны (у меня было несколько проблем с несколькими ветками, особенно с svn externals).

Atlassian на самом деле написал guide по svn для git-миграции (и на этих страницах у них также есть хорошие учебники).

git очень мощный, но есть одна оговорка: до сих пор у Git не было ничего такого простого, как svn: externals. Есть альтернативы (git subtree и git submodules), но они никогда не работают так же интуитивно, как svn externals (но это для другого вопроса: посмотрите на stackoverflow, вы найдете много вопросов, связанных с этой темой)

1
Chris Maes

Некоторое время назад я перенес наш CVS-репозиторий в git, сначала преобразовав его в Subversion, а затем в git. Это хорошо работало при использовании подходящего инструмента для этого.

Смотрите Самый надежный способ преобразовать репозиторий CVS, содержащий проекты Eclipse, в git?

Кроме того, когда закончите, тестируйте строго.

Что касается git-ветвления, это не самая умная часть. Преимущество приходит, когда вам нужно объединить ветви.

1
Thorbjørn Ravn Andersen