32 Вопрос: Как перенести репозиторий SVN с историей в новый репозиторий Git?

вопрос создан в Thu, Dec 7, 2017 12:00 AM

Я прочитал руководство по Git, FAQ, Git - SVN и т.д., и все они объясняют то и это, но нигде не найти такой простой инструкции, как:

Репозиторий SVN в: svn://myserver/path/to/svn/repos

Git репозиторий в: git://myserver/path/to/git/repos

 
git-do-the-magic-svn-import-with-history \
svn://myserver/path/to/svn/repos \
git://myserver/path/to/git/repos

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

    
1464
  1. Становится легче, я просто сам завершил его и задокументировал свои выводы с помощью SO jmoses.co/2014/03/21/moving-from-svn-to-git.html
    2014-03-21 21: 20: 59Z
  2. Используйте ответ Кейси ниже, но перед тем, как запустить команду "svn clone ...", посмотрите, как добавить дополнительную строку "Visual SVN Server" для вашего пользователя. текстовый файл ... здесь: stackoverflow.com/questions/8971208/…
    2016-02-09 07: 21: 55Z
  3. Кроме того, если в вашем профиле GitHub отмечен параметр «сделать личную электронную почту закрытым», используйте его в качестве адреса электронной почты в users.txt для соответствия. yourgituser@users.noreply .github.com, поэтому ваш реальный адрес электронной почты не отображается при коммитах.
    2016-02-09 07: 39: 11Z
30 ответов                              30                         

Magic:

 
$ git svn clone http://svn/repo/here/trunk

Git и SVN работают очень по-разному. Вам нужно изучить Git, и если вы хотите отслеживать изменения из SVN upstream, вам нужно выучить git-svn. Страница man git-svn имеет хороший раздел примеров:

 
$ git svn --help
    
517
2012-05-16 15: 42: 39Z
  1. Ответ @Casey гораздо лучше отвечает на исходный вопрос.
    2012-02-26 14: 58: 03Z
  2. Сохранит ли это ветви и все такое? или просто клонировать сундук?
    2012-09-25 19: 16: 44Z
  3. @ Eildosa: это просто клонирует ствол. См. Ответ Кейси для альтернативы.
    2013-08-10 13: 30: 13Z
  4. @ DougWilson, но я не вижу ответа Кейси здесь. Это ответ ниже с 13 авторами, который начинается с "Создать файл пользователя"?
    2016-08-05 08: 50: 24Z
  5. Для всех, кому интересно, что такое "ответ Кейси", на который ссылаются во многих комментариях, это этот (Кейси изменил свой ник на cmcginty).
    2016-10-05 10: 35: 36Z

Создайте файл пользователей (т.е. users.txt) для сопоставления пользователей SVN с Git:

 
user1 = First Last Name <email@address.com>
user2 = First Last Name <email@address.com>
...

Вы можете использовать этот однострочный шаблон для создания шаблона из вашего существующего хранилища SVN:

 
svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > users.txt

SVN остановится, если обнаружит отсутствующего пользователя SVN, которого нет в файле. Но после этого вы можете обновить файл и забрать, где вы остановились.

Теперь извлеките данные SVN из хранилища:

git svn clone --stdlayout --no-metadata --authors-file=users.txt svn://hostname/path dest_dir-tmp

Эта команда создаст новый репозиторий Git в dest_dir-tmp и начнет извлекать SVN-репозиторий. Обратите внимание, что флаг "--stdlayout" подразумевает, что у вас есть общая структура SVN "trunk /, branch /, tags /". Если ваш макет отличается, ознакомьтесь с параметрами --tags, --branches, --trunk (в общем случае git svn help).

Разрешены все распространенные протоколы: svn://, http://, https://. URL должен быть нацелен на базовый репозиторий, что-то вроде http://svn.mycompany.com/myrepo/repositoryа>. Это не должно включать /trunk, /tag или /branches.

Обратите внимание, что после выполнения этой команды очень часто выглядит, что операция «зависла /зависла», и вполне нормально, что она может застрять на долгое время после инициализации нового репозитория. В конце концов вы увидите сообщения журнала, которые указывают, что он мигрирует.

Также обратите внимание, что если вы опустите флаг --no-metadata, Git добавит информацию о соответствующей ревизии SVN к сообщению фиксации (т.е. git-svn-id: svn://svn.mycompany.com/myrepo/<branchname/trunk>@<RevisionNumber> <Repository UUID>)

Если имя пользователя не найдено, обновите файл users.txt:

 
cd dest_dir-tmp
git svn fetch

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

 
git svn fetch

По завершении Git извлечет SVN trunk в новую ветку. Любые другие филиалы настроены как удаленные. Вы можете просмотреть другие ветви SVN с помощью:

 
git branch -r

Если вы хотите сохранить другие удаленные ветви в своем хранилище, вы должны создать локальную ветку для каждой из них вручную. (Пропустите trunk /master.) Если вы этого не сделаете, ветви не будут клонированы на последнем этапе.

 
git checkout -b local_branch remote_branch
# It's OK if local_branch and remote_branch are the same name

Теги импортируются как ветви. Вы должны создать локальную ветку, создать тег и удалить ветку, чтобы они были в Git как теги. Чтобы сделать это с тегом "v1":

 
git checkout -b tag_v1 remotes/tags/v1
git checkout master
git tag v1 tag_v1
git branch -D tag_v1

Клонируйте свой GIT-SVN-репозиторий в чистый Git-репозиторий:

 
git clone dest_dir-tmp dest_dir
rm -rf dest_dir-tmp
cd dest_dir

Локальные ветки, которые вы создали ранее из удаленных веток, будут скопированы только как удаленные ветки в новый клонированный репозиторий. (Пропустите trunk /master.) Для каждой ветви, которую вы хотите сохранить:

 
git checkout -b local_branch origin/remote_branch

Наконец, удалите пульт из вашего чистого Git-репозитория, который указывает на удаленный временный репозиторий:

 
git remote rm origin
    
1518
2018-01-15 09: 36: 14Z
  1. Этот пост в блоге Eelke является отличной перекрестной ссылкой на ответ выше. blokspeed.net/blog/2010/09/converting-from -subversion к мерзавцу
    2012-03-06 16: 13: 12Z
  2. Это на 99% круто, выполнив эти шаги, я привел в порядок все, кроме веток: после последнего шага они были только удаленными (и, как таковые, исчезли, когда я это сделал команда: git remote rm origin)
    2012-03-29 09: 22: 59Z
  3. Я просто использовал эту процедуру, и она работала довольно хорошо. Мои наблюдения таковы: 1) процесс преобразования «ветвей тегов» в теги все еще оставляет ветви (хотя и без метки). Если вы создали тег в SVN без изменения содержимого, то вы можете фактически пометить предыдущий коммит и удалить «ветку тега» для более чистой истории. 2) не упоминается о переносе атрибутов svn: ignore. Это рассматривается в другом месте в Интернете. Смотрите также «git svn show-ignore». 3) последний клон мне не помог. На самом деле я получил удаленные ссылки на исходный каталог, что было странно.
    2012-09-21 14: 30: 36Z
  4. В GitHub есть очень удобный шаг за шагом: 2012-10-17 14: 11: 38Z
  5. Для тех, кто работает под Windows, я создал сценарий PowerShell на основе этого метода: gist.github.com/Gimly/90df046dc38181bb18de
    2014-06-16 09: 42: 31Z

Чисто Перенесите свой репозиторий Subversion в репозиторий Git . Сначала вы должны создать файл, который сопоставляет имена авторов ваших коммитов Subversion с коммиттерами Git, скажем, ~/authors.txt:

 
jmaddox = Jon Maddox <jon@gmail.com>
bigpappa = Brian Biggs <bigpappa@gmail.com>

Затем вы можете загрузить данные Subversion в репозиторий Git:

 
mkdir repo && cd repo
git svn init http://subversion/repo --no-metadata
git config svn.authorsfile ~/authors.txt
git svn fetch

Если вы работаете на Mac, вы можете получить git-svn от MacPorts, установив git-core +svn.

Если ваш репозиторий subversion находится на той же машине, что и желаемый репозиторий git, тогда вы можете использовать этот синтаксис для этапа инициализации, в противном случае все то же самое:

 
git svn init file:///home/user/repoName --no-metadata
    
185
2012-10-31 23: 08: 52Z
  1. Как я прокомментировал другой ответ, мне пришлось удалить пробелы около = в users.txt, потому что импорт прерывался, и я получал пустой репозиторий.
    2013-01-31 03: 08: 31Z
  2. А! Простое и эффективное объяснение. В моем случае file:/// отказался работать, просто я использовал svnserve.exe --daemon, а затем вместо него использовал svn://localhost/home/user/repo.
    2013-06-05 12: 13: 44Z
  3. На моем Mac, работающем под управлением Mountain Lion, git svn не будет работать, пока я не зайду в Xcode и не установлю инструменты командной строки, найденные на вкладке «Загрузки» панели «Настройки». В качестве альтернативы я мог бы установить только инструменты командной строки для OS X Mountain Lion, которые можно найти на сайте разработчиков Apple.
    2013-08-23 13: 21: 43Z
  4. В моем случае мне пришлось преобразовать файл authors.txt в utf-8 without BOM.
    2015-11-25 10: 31: 05Z
  5. Похоже, что в этой ссылке отсутствует некоторая информация
    2016-09-02 04: 57: 06Z

Я использовал сценарий svn2git и работает как шарм.

    
69
2018-11-23 14: 29: 00Z
  1. Q: это исправляет пробелы в именах тегов и веток (разрешено в svn и не разрешено в git)?
    2011-06-04 19: 16: 55Z
  2. Это руководство по его использованию полезно: troyhunt.com/2014/08/migrating-from-subversion-to-git-with.html
    2015-02-08 19: 25: 18Z
  3. Это не удалось для меня с проблемой: groups.google.com/forum /#! topic /msysgit /7MQVwRO-2N4 - см. также: github.com/nirvdrum/svn2git/issues/50 Решение было здесь: stackoverflow.com/questions/3009738/…
    2016-12-08 16: 03: 34Z
  4. Желательно объяснять ответы, в противном случае мы создадим детишки сценария.
    2017-06-24 04: 19: 02Z
  5. А что если все ваши ветви находятся в корне SVN, а у вас нет транка или тегов?
    2017-12-06 12: 34: 13Z
  6. ол>

Я предлагаю освоиться с Git, прежде чем пытаться использовать git-svn постоянно, то есть сохранять SVN в качестве централизованного репо и использовать Git локально.

Однако, для простой миграции со всей историей, вот несколько простых шагов:

Инициализация локального репо:

 
mkdir project
cd project
git svn init http://svn.url

Отметьте, как далеко вы хотите начать импорт ревизий:

 
git svn fetch -r42

(или просто "git svn fetch" для всех оборотов)

На самом деле получить все с тех пор:

 
git svn rebase

Вы можете проверить результат импорта с помощью Gitk. Я не уверен, что это работает в Windows, работает в OSX и Linux:

 
gitk

Если у вас есть SVN-репозиторий, клонированный локально, вы можете перенести его в централизованное Git-репо для упрощения совместной работы.

Сначала создайте свое пустое удаленное репо (может быть, на GitHub ?):

 
git remote add origin git@github.com:user/project-name.git

Затем, при необходимости, синхронизируйте основную ветку, чтобы операция извлечения автоматически объединяла удаленный мастер с вашим локальным мастером, когда оба содержат новый материал:

 
git config branch.master.remote origin
git config branch.master.merge refs/heads/master

После этого вас может заинтересовать мой собственный инструмент git_remote_branch, который помогает работать с удаленными ветками:

Первый пояснительный пост: " Git удаленных веток " р>

Продолжение для самой последней версии: " Время работать с git_remote_branch "

    
57
2012-09-18 17: 00: 54Z
  1. Чрезвычайно полезно, это работало отлично. Я хотел бы добавить, что есть один последний шаг, если вы синхронизируете данные с удаленным репозиторием. После шагов git config мне нужно было git push origin master
    2012-10-24 15: 17: 35Z

Существует новое решение для плавного перехода с Subversion на Git (или для одновременного использования обоих): SubGit .

Я работаю над этим проектом сам. Мы используем SubGit в наших репозиториях - некоторые из моих товарищей по команде используют Git и некоторые Subversion, и пока это работает очень хорошо.

Чтобы перейти с Subversion на Git с SubGit, вам нужно выполнить:

 
$ subgit install svn_repos
...
TRANSLATION SUCCESSFUL 

После этого вы получите Git-репозиторий в svn_repos /.git и можете клонировать его, или просто продолжать использовать Subversion и этот новый Git-репозиторий вместе: SubGit гарантирует, что оба они всегда синхронизированы.

Если ваш репозиторий Subversion содержит несколько проектов, в каталоге svn_repos /git будет создано несколько репозиториев Git. Чтобы настроить перевод перед запуском, выполните следующие действия:

 
$ subgit configure svn_repos
$ edit svn_repos/conf/subgit.conf (change mapping, add authors mapping, etc)
$ subgit install svn_repos

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

Надеюсь, это поможет!

    
30
2018-11-23 07: 49: 45Z
  1. Обратите внимание, что для однократного импорта (с помощью команды subgit import) даже не требуется лицензия. Также включен точный перевод свойства svn:ignore в файлы .gitignore.
    2015-03-04 22: 26: 59Z
  2. SubGit не распознает ни мой закрытый ключ, ни какие-либо флаги, которые я установил в командной строке. Документация очень плохая. Это не жизнеспособная альтернатива для git svn.
    2015-06-16 11: 43: 08Z
  3. ошибка: 'svn_repos' не является допустимым настроенным местоположением; Файл конфигурации SubGit отсутствует.
    2015-11-06 19: 37: 38Z

См. официальную страницу руководства git-svn . В частности, посмотрите в разделе «Основные примеры»:

  

Отслеживание и участие во всем управляемом Subversion проекте (завершено       со стволом, метками и ветками):

 
# Clone a repo (like git clone):
    git svn clone http://svn.foo.org/project -T trunk -b branches -t tags
    
17
2008-10-06 15: 38: 32Z
13
2012-09-17 16: 19: 10Z
  1. Объяснение Pro Git включает миграцию тегов и ветвей. Он использует локальные команды mv, а не svn. умный.
    2011-06-04 19: 19: 44Z

SubGit (против синего экрана смерти)

 
subgit import --svn-url url://svn.serv/Bla/Bla  directory/path/Local.git.Repo

Это все.

+ Для обновления из SVN - Git-репозиторий, созданный первой командой.

 
subgit import  directory/path/Local.git.Repo

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

Вот мой путь.

Мое решение выглядит так:

  • Перенос SVN в репозиторий Git
  • Обновите репозиторий Git непосредственно перед переходом команды на .

Миграция занимает много времени для большого хранилища SVN.
Но обновление завершенной миграции всего за несколько секунд.

Конечно, я использую SubGit , мама. git-svn делает меня Голубым экраном смерти . Просто постоянно. И git-svn утомляет меня из-за слишком длинного имени Git " "Фатальная ошибка.

ШАГОВ

1. Загрузить SubGit

2. Подготовьте команды переноса и обновления.

Допустим, мы делаем это для Windows (портирование на Linux тривиально).
В установочном каталоге bin SubGit (subgit-2.X.X \bin) создайте два файла .bat.

Содержимое файла /команды для миграции:

 
start    subgit import --svn-url url://svn.serv/Bla/Bla  directory/path/Local.git.Repo

Команда «start» здесь необязательна (Windows). Это позволит увидеть ошибки при запуске и оставить оболочку открытой после завершения SubGit.

Вы можете добавить сюда дополнительные параметры, аналогичные git-svn . Я использую только - домен по умолчанию myCompanyDomain.com , чтобы исправить домен адреса электронной почты авторов SVN.
У меня есть стандартная структура репозитория SVN (ствол /ветви /теги), и у нас не было проблем с «отображением авторов». Так что я больше ничего не делаю.

(Если вы хотите перенести теги, такие как ветви, или у вашего SVN есть несколько папок веток /тегов, вы можете использовать более подробный SubGit подход )

Совет 1 : используйте --minimal-revision YourSvnRevNumber, чтобы быстро увидеть, как все работает (какая-то отладка). Особенно полезно видеть разрешенные имена авторов или электронные письма.
Или ограничить глубину истории миграции.

Совет 2 . Миграция может быть прервана ( Ctrl + C ) и восстановлена ​​путем запуска следующей команды /файла обновления.
Я не советую делать это для больших репозиториев. Я получил "Недостаточно памяти Java + Windows исключение".

Совет 3 . Лучше создать копию вашего чистого хранилища результатов.

Содержимое файла /команды для обновления:

 
start    subgit import  directory/path/Local.git.Repo

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

Предупреждение! Не трогайте свой пустой репозиторий (например, создание веток).
Вы получите следующую фатальную ошибку:

  

Неустранимая ошибка: не синхронизированы и не могут быть синхронизированы ... Перевод изменений Subversion в коммиты Git ...

3. Запустите первую команду /файл. Это займет много времени для большого хранилища. 30 часов для моего скромного хранилища.

Это все.
Вы можете в любое время обновить Git-репозиторий из SVN любое количество раз, запустив второй файл /команду. И до перехода вашей команды разработчиков на Git.
Это займет всего несколько секунд.

Есть еще одна полезная задача.

Переместите локальный репозиторий Git в удаленный репозиторий Git

Это твой случай? Давайте продолжим.

  1. Настройте пульты

Run:

 
$ git remote add origin url://your/repo.git
  1. Подготовьтесь к первоначальной отправке вашего огромного локального репозитория Git в удаленный репозиторий

По умолчанию ваш Git не может отправлять большие куски. неустранимый: удаленный конец неожиданно зависает

Давай побежим за этим:

 
git config --global http.postBuffer 1073741824

524288000 - 500 МБ 1073741824 - 1 ГБ и т. Д.

Исправьте свой локальный проблемы с сертификатом . Если ваш git-сервер использует испорченный сертификат.

Я отключил сертификаты .

Кроме того, ваш Git-сервер может иметь ограничения количества запросов, которые необходимо исправить . р>

  1. Переместить всю миграцию в удаленный Git-репозиторий команды.

Запустите с локальным Git:

 
git push origin --mirror

( git push origin '*: *' для старых версий Git)

Если вы получаете следующее: ошибка: не удается создать git: такого файла или каталога нет ... Для меня полное восстановление моего хранилища решает эту ошибку (30 часов). Вы можете попробовать следующие команды

 
git push origin --all
git push origin --tags

Или попробуйте переустановить Git ( бесполезно для я ). Или вы можете создавать ветви из всех своих тегов и нажимать их. Или, или, или ...

    

13
2017-05-23 12: 18: 30Z

reposurgeon

Для сложных случаев, репохирург от Эрик С. Рэймонд является предпочтительным инструментом. Помимо SVN он поддерживает множество других систем контроля версий в формате fast-export, а также CVS . Автор сообщает об успешных конверсиях древних репозиториев, таких как Emacs и FreeBSD .

Инструмент, по-видимому, нацелен почти на идеальное преобразование (например, преобразование SVN svn:ignore свойств для .gitignore файлов) даже для сложных макетов репозитория с большой историей. Во многих случаях другие инструменты могут быть проще в использовании.

Прежде чем углубляться в документацию командной строки reposurgeon, обязательно прочитайте превосходный Руководство по миграции DVCS , которое шаг за шагом описывает процесс конвертации.

    
9
2015-11-17 21: 34: 36Z

Это руководство на веб-сайте atlassian является одним из лучших, которые я нашел:

https://www.atlassian.com/git/migration

Этот инструмент - https://bitbucket.org/atlassian/svn-migration-scripts - также очень полезен для генерации вашего author.txt среди прочего.

    
7
2014-03-13 13: 58: 34Z
  1. Эта страница замечательная и, на мой взгляд, лучший ответ! Это делает большую часть тяжелой работы для вас.
    2018-08-06 16: 38: 16Z

Вы должны установить

 
git
git-svn

Скопировано по этой ссылке http://john.albin.net/git/преобразовать-подрывные к мерзавцу .

1. Получить список всех коммиттеров Subversion

Subversion просто перечисляет имя пользователя для каждого коммита. В коммитах Git гораздо больше данных, но в самом простом случае автору коммитов нужно указать имя и адрес электронной почты. По умолчанию инструмент git-svn просто перечислит имя пользователя SVN как в поле автора, так и в поле электронной почты. Но немного поработав, вы можете создать список всех пользователей SVN и их соответствующие имена и адреса электронной почты Git. Этот список может использоваться git-svn для преобразования простых имен пользователей svn в надлежащие коммиттеры Git.

Из корня локальной проверки Subversion выполните эту команду:

 
svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > authors-transform.txt

Это захватит все сообщения журнала, вычеркнет имена пользователей, удалит все дубликаты имен пользователей, отсортирует имена пользователей и поместит их в файл «hors-transform.txt ». Теперь отредактируйте каждую строку в файле. Например, конвертировать:

 
jwilkins = jwilkins <jwilkins>

в это:

 
jwilkins = John Albin Wilkins <johnalbin@example.com>

2. Клонировать хранилище Subversion с помощью git-svn

 
git svn clone [SVN repo URL] --no-metadata -A authors-transform.txt --stdlayout ~/temp

Это выполнит стандартное преобразование git-svn (с использованием файла авторов-transform.txt, созданного на шаге 1) и поместит репозиторий git в папку «~ /temp» в вашем домашнем каталоге.

3. Преобразовать svn: игнорировать свойства в .gitignore

Если в вашем репозитории svn использовались свойства svn: ignore, вы можете легко преобразовать его в файл .gitignore, используя:

 
cd ~/temp
git svn show-ignore > .gitignore
git add .gitignore
git commit -m 'Convert svn:ignore properties to .gitignore.'

4. Переместить репозиторий в пустой репозиторий git

Сначала создайте пустой репозиторий и сделайте так, чтобы его ветвь по умолчанию соответствовала имени ветки svn «trunk».

 
git init --bare ~/new-bare.git
cd ~/new-bare.git
git symbolic-ref HEAD refs/heads/trunk

Затем поместите временный репозиторий в новый пустой репозиторий.

 
cd ~/temp
git remote add bare ~/new-bare.git
git config remote.bare.push 'refs/remotes/*:refs/heads/*'
git push bare

Теперь вы можете безопасно удалить ~ /temp репозиторий.

5. Переименуйте ветвь «ствол» в «мастер»

Ваша основная ветка разработки будет называться «trunk», что соответствует имени, которое было в Subversion. Вы хотите переименовать его в стандартную «основную» ветку Git, используя:

 
cd ~/new-bare.git
git branch -m trunk master

6. Очистить ветки и теги

git-svn превращает все теги Subversions в очень короткие ветви в Git в форме «теги /имя». Вы хотите преобразовать все эти ветви в фактические теги Git, используя:

 
cd ~/new-bare.git
git for-each-ref --format='%(refname)' refs/heads/tags |
cut -d / -f 4 |
while read ref
do
  git tag "$ref" "refs/heads/tags/$ref";
  git branch -D "tags/$ref";
done

Этот шаг займет немного времени. :-) Но не волнуйтесь; Ваша оболочка Unix обеспечит > дополнительная подсказка для очень длинной команды, которая начинается с git for-each-ref.

    
7
2014-07-22 04: 36: 33Z

GitHub теперь имеет функцию для импорта из репозитория SVN . Я никогда не пробовал, хотя.

    
6
2008-09-21 02: 15: 07Z
  1. 2014-01-30 02: 42: 24Z
  2. Импортированные два довольно больших проекта только сейчас без нареканий. Все филиалы SVN были импортированы (только помнитеНЕ используется \trunk в пути репо). Одна вещь, которую я пока не знаю, это то, будет ли Github отслеживать новые коммиты.
    2014-08-11 12: 15: 35Z

Несколько расширенный ответ, использующий только git, SVN и bash. Он включает в себя шаги для репозиториев SVN, в которых не используется обычная компоновка с компоновкой каталогов транка /ветвей /тегов (SVN абсолютно ничего не делает для обеспечения реализации такой компоновки).

Сначала используйте этот сценарий bash, чтобы отсканировать репозиторий SVN для разных людей, которые внесли свой вклад, и сгенерировать шаблон для файла сопоставления:

 
#!/usr/bin/env bash
authors=$(svn log -q | grep -e '^r' | awk 'BEGIN { FS = "|" } ; { print $2 }' | sort | uniq)
for author in ${authors}; do
  echo "${author} = NAME <USER@DOMAIN>";
done

Используйте это для создания файла authors, в котором вы сопоставляете имена пользователей svn с именами пользователей и электронной почтой, как установлено вашими разработчиками, используя git config Свойства user.name и user.email (обратите внимание, что для такой службы, как GitHub, достаточно иметь только совпадающую электронную почту).

Затем попросите git svn клонировать svn. репозиторий в репозиторий git, рассказывающий об отображении:

git svn clone --authors-file=authors --stdlayout svn://example.org/Folder/projectroot

Это может занять невероятно много времени, так как git svn будет индивидуально проверять каждую ревизию для каждого существующего тега или ветви. (обратите внимание, что теги в SVN на самом деле являются просто ветвями, поэтому они заканчиваются в Git). Вы можете ускорить это, удалив старые теги и ветки в SVN, которые вам не нужны.

Выполнение этого на сервере в той же сети или на том же сервере также может значительно ускорить это. Кроме того, если по какой-либо причине этот процесс прерывается, вы можете возобновить его, используя

git svn rebase --continue

Во многих случаях вы сделали здесь. Но если у вашего репозитория SVN нетрадиционный макет, где у вас просто есть каталог в SVN, который вы хотите поместить в ветку git, вы можете сделать несколько дополнительных шагов.

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

Вы также можете сделать это, используя git. Для git svn clone просто используйте каталог, который вы хотите поместить в ветку git.

После запуска

 
git branch --set-upstream master git-svn
git svn rebase

Обратите внимание, что для этого требуется Git 1.7 или выше.

    
6
2013-10-29 10: 41: 21Z
  1. Я бы предложил объединить эту информацию с этой ссылкой: sailmaker.co.uk/blog/2013/05/05/…
    2013-11-11 10: 09: 10Z

Я опубликовал пошаговое руководство ( здесь ) для преобразования svn в git, включая преобразование svn-тегов в git-теги и svn-ветвей в git-ветви.

Короткая версия:

1) клон svn из определенного номера ревизии. (номер редакции должен быть самым старым, который вы хотите перенести)

 
git svn clone --username=yourSvnUsername -T trunk_subdir -t tags_subdir -b branches_subdir -r aRevisionNumber svn_url gitreponame

2) получить данные SVN. Этот шаг занимает больше всего времени.

 
cd gitreponame
git svn fetch

повторяйте git svn fetch до тех пор, пока не закончите без ошибок

3) обновите основную ветку

 
git svn rebase

4) Создание локальных веток из веток svn путем копирования ссылок

 
cp .git/refs/remotes/origin/* .git/refs/heads/

5) конвертировать svn-теги в git-теги

 
git for-each-ref refs/remotes/origin/tags | sed 's#^.*\([[:xdigit:]]\{40\}\).*refs/remotes/origin/tags/\(.*\)$#\2 \1#g' | while read p; do git tag -m "tag from svn" $p; done

6) Поместите репозиторий в лучшее место, например, github

 
git remotes add newrepo git@github.com:aUser/aProjectName.git
git push newrepo refs/heads/*
git push --tags newrepo

Если вам нужна дополнительная информация, прочитайте мою запись . или спроси меня.

    
5
2016-02-25 20: 27: 14Z

Мы можем использовать git svn clone команд, как показано ниже.

  • svn log -q <SVN_URL> | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > authors.txt

Приведенная выше команда создаст файл авторов из коммитов SVN.

  • svn log --stop-on-copy <SVN_URL>

Выше команда даст вам первый номер ревизии, когда ваш SVN проект создан.

  • git svn clone -r<SVN_REV_NO>:HEAD --no-minimize-url --stdlayout --no-metadata --authors-file authors.txt <SVN_URL>

Приведенная выше команда создаст Git-репозиторий на локальном компьютере.

Проблема в том, что он не будет преобразовывать ветви и теги в push. Вам придется делать их вручную. Например, ниже для филиалов:

 
$ git remote add origin https://github.com/pankaj0323/JDProjects.git
$ git branch -a
* master
  remotes/origin/MyDevBranch
  remotes/origin/tags/MyDevBranch-1.0
  remotes/origin/trunk
$$ git checkout -b MyDevBranch origin/MyDevBranch
Branch MyDevBranch set up to track remote branch MyDevBranch from origin.
Switched to a new branch 'MyDevBranch'
$ git branch -a
* MyDevBranch
  master
  remotes/origin/MyDevBranch
  remotes/origin/tags/MyDevBranch-1.0
  remotes/origin/trunk
$

Для тегов:

 
$git checkout origin/tags/MyDevBranch-1.0
Note: checking out 'origin/tags/MyDevBranch-1.0'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 3041d81... Creating a tag
$ git branch -a
* (detached from origin/tags/MyDevBranch-1.0)
  MyDevBranch
  master
  remotes/origin/MyDevBranch
  remotes/origin/tags/MyDevBranch-1.0
  remotes/origin/trunk
$ git tag -a MyDevBranch-1.0 -m "creating tag"
$git tag
MyDevBranch-1.0
$

Теперь отправьте master, ветви и теги в удаленный репозиторий git.

 
$ git push origin master MyDevBranch MyDevBranch-1.0
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (14/14), 2.28 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To https://github.com/pankaj0323/JDProjects.git
 * [new branch]      master -> master
 * [new branch]      MyDevBranch -> MyDevBranch
 * [new tag]         MyDevBranch-1.0 -> MyDevBranch-1.0
$

утилита svn2git

svn2git удаляет ручные операции с ветвями и тегами.

Установите его с помощью команды sudo gem install svn2git. После этого выполните команду ниже.

  • $ svn2git <SVN_URL> --authors authors.txt --revision <SVN_REV_NO>

Теперь вы можете перечислять ветви, теги и легко их нажимать.

 
$ git remote add origin https://github.com/pankaj0323/JDProjects.git
$ git branch -a
  MyDevBranch
* master
  remotes/svn/MyDevBranch
  remotes/svn/trunk
$ git tag
  MyDevBranch-1.0
$ git push origin master MyDevBranch MyDevBranch-1.0

Представьте, что у вас есть 20 веток и тегов, очевидно, что svn2git сэкономит вам много времени, и поэтому мне он нравится больше, чем нативные команды. Это хорошая оболочка для родной команды git svn clone.

Полный пример приведен в моей записи в блоге . р>     

5
2016-05-02 16: 13: 49Z

TortoiseGit делает это. см. этот пост в блоге: http://jimmykeen.net/articles/03-nov-2012/how-migrate-from-svn-to-git-windows-using-tortoise-clients

Да, я знаю, что отвечать ссылками - это не здорово, но это решение, а?

    
4
2013-04-18 03: 41: 17Z
  1. Эта ссылка не работает.
    2019-05-10 18: 09: 42Z
  2. Попробуйте машину обратного хода на archive.org
    2019-05-10 20: 08: 42Z

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

    
3
2011-03-22 00: 34: 48Z

Если вы используете SourceTree, вы можете сделать это прямо из приложения. Перейти к файлу - > Затем нажмите New /Clone: ​​

  1. Введите URL-адрес удаленного SVN в качестве «исходного пути /URL».
  2. Введите свои учетные данные при появлении запроса.
  3. Введите местоположение локальной папки как «Путь к месту назначения».
  4. Дай ему имя.
  5. В дополнительных настройках выберите «Git» из выпадающего меню «Создать локальный». хранилище типа ".
  6. При желании вы можете указать ревизию для клонирования.
  7. Хит Клон.

Откройте репозиторий в SourceTree, и вы увидите, что ваши коммит-сообщения тоже перенесены.

Теперь перейдите в репозиторий - > Настройки репозитория и добавление новых подробностей удаленного репо. Удалите пульт SVN, если хотите (я сделал это с помощью параметра «Редактировать файл конфигурации».

Вставьте код в новое удаленное хранилище, когда будете готовы, и пишите код свободно.

    
3
2014-06-17 04: 43: 33Z
  1. Спасибо, супер и просто!
    2014-06-23 12: 40: 31Z
  2. Спасибо. Это сработало для меня. Я использую SourceTree и Stash.
    2015-10-20 16: 21: 18Z

Для пользователей GitLab я рассказал о том, как я перешел с SVN:

https://gist.github.com/leftclickben/322b7a3042cbe97ed2af

Действия по переходу с SVN на GitLab

Настройка

  • SVN размещен на svn.domain.com.au.
  • SVN доступен через http (другие протоколы должны работать).
  • GitLab размещен на git.domain.com.au и:
    • Группа создана с пространством имен dev-team.
    • По крайней мере одна учетная запись пользователя создана, добавлена ​​в группу и имеет ключ SSH для учетной записи, используемой для миграции (тестирование с использованием ssh git@git.domain.com.au).
    • Проект favourite-project создается в пространстве имен dev-team.
  • Файл users.txt содержит соответствующие данные пользователя, по одному пользователю на строку, в форме username = First Last <address@domain.com.au>, где username - это имя пользователя, указанное в журналах SVN. (Подробности см. В первой ссылке в разделе «Ссылки», в частности, ответ пользователя Кейси).

Версия

  • версия subversion 1.6.17 (r1128011)
  • git version 1.9.1
  • GitLab версии 7.2.1 ff1633f
  • Ubuntu server 14.04

Команды

 
bash
git svn clone --stdlayout --no-metadata -A users.txt 
http://svn.domain.com.au/svn/repository/favourite-project
cd favourite-project
git remote add gitlab git@git.domain.com.au:dev-team/favourite-project.git
git push --set-upstream gitlab master

Вот и все! Перезагрузите страницу проекта в веб-интерфейсе GitLab, и вы увидите все коммиты и файлы, перечисленные в списке.

Примечания

  • Если есть неизвестные пользователи, команда git svn clone остановится, и в этом случае обновление users.txt, cd favourite-project и git svn fetch продолжится с того места, где оно остановилось.
  • Требуется стандартная компоновка trunk - tags - branches для репозитория SVN.
  • URL-адрес SVN, данный команде git svn clone, останавливается на уровне, непосредственно превышающем trunk/, tags/ и branches/.
  • Команда git svn clone выдает много выходных данных, включая некоторые предупреждения вверху; Я проигнорировал предупреждения.
3
2015-05-04 21: 21: 16Z
  1. Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными в случае изменения связанной страницы.
    2015-05-04 21: 09: 35Z
  2. Я не согласен. Связанный контент может измениться, и дублированный здесь контент не будет обновлен, и, следовательно, может быть устаревшим (и фактически я считаю, что он изменился с тех пор, как я первоначально опубликовал этот ответ). В руководящих принципах говорится только о том, чтобы включить какой-то релевантный контекст для ссылки, что я и сделал - на настоящий вопрос ссылка была дана оптом. Копирование всего связанного ресурса здесь не является обязательным или необходимым. Был ли я за это проголосовал?!
    2015-05-06 06: 38: 11Z
  3. Ссылка на рекомендации: stackoverflow.com/help/how-to -ответ
    2015-05-06 06: 38: 44Z

Кроме того, команда git-stash - это находка, когда вы пытаетесь выполнить git с помощью git-svn dcommits.

Типичный процесс:

  1. настроить git-репо
  2. поработайте над разными файлами
  3. решите проверить некоторые из работ, используя git
  4. решите svn-dcommit
  5. получить ужасную ошибку «невозможно зафиксировать с грязным индексом».

Решение (требуется git 1.5.3+):

 
git stash; git svn dcommit ; git stash apply
    
2
2008-09-26 13: 13: 26Z

Вот простой сценарий оболочки без зависимостей, который преобразует один или несколько SVN-репозиториев в git и передает их в GitHub.

https://gist.github.com/NathanSweet/7327535

Примерно в 30 строках скрипта это: клоны, использующие git SVN, создающие файл .gitignore из свойств SVN :: ignore, помещают в пустой репозиторий git, переименовывают ствол SVN в master, преобразуют теги SVN в теги git и выталкивают это GitHub с сохранением тегов.

Я прошел через много Пайn перенести дюжину SVN-репозиториев из Google Code в GitHub. Это не помогло, что я использовал Windows. На моем старом компьютере с Debian была разбита всякая рубина, и заставить его работать на Windows было шуткой. Другие решения не работали с путями Cygwin. Даже когда я что-то заработал, я не мог понять, как заставить теги отображаться на GitHub (секрет --follow-tags).

В конце я соединил два коротких и простых сценария, связанных выше, и это прекрасно работает. Решение не должно быть более сложным, чем это!

    
2
2013-11-06 14: 11: 59Z
  1. Я использовал этот скрипт. После небольшого количества ошибок и ошибок это сработало для меня. Обратите внимание, что вам нужен Git 1.8. .3+ для этого, так как --follow-tags поддерживается только после этого.
    2014-02-17 19: 41: 24Z

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

transfer.bat http://svn.my.address/svn/myrepo/trunk https://git.my.address/orga/myrepo

Возможно, кто-нибудь может использовать это. Он создает TMP-папку, проверяет репозиторий SVN с помощью git, добавляет новый источник и отправляет его ... и снова удаляет папку.

 
@echo off 
SET FROM=%1 
SET TO=%2 
SET TMP=tmp_%random%

echo from:  %FROM% 
echo to:    %TO% 
echo tmp:   %TMP%

pause

git svn clone  --no-metadata --authors-file=users.txt %FROM% %TMP%  
cd %TMP% 
git remote add origin %TO% 
git push --set-upstream origin master


cd .. 
echo delete %TMP% ... 
pause

rmdir /s /q %TMP%

Вам по-прежнему нужен файл users.txt с вашими сопоставлениями пользователей, такими как

 
User1 = User One <u.1@xxx.com>
    
2
2018-02-06 06: 37: 45Z
  1. Этот ответ помог мне без проблем переместить все мои репозитории в BitBucket.
    2018-05-28 12: 28: 56Z
  2. Рад слышать. У меня был только опыт работы с Gitea ... но я перенес ~~ 40 репозиториев таким образом.
    2018-05-29 13: 24: 08Z
  3. Очень приятно! Thnx
    2019-04-01 14: 21: 05Z
  4. предупреждение; У меня были проблемы с кодировкой. Я понял это действительно слишком поздно, но это заняло у меня несколько часов. Пожалуйста, убедитесь, что ваш репо содержит точные (!) Ожидаемые источники
    2019-04-02 15: 29: 13Z

Я просто хотел добавить свой вклад в сообщество Git. Я написал простой скрипт bash, который автоматизирует полный импорт. В отличие от других инструментов миграции, этот инструмент основан на нативном git, а не на jGit. Этот инструмент также поддерживает репозитории с большой историей ревизий и большими каплями. Это доступно через github:

https://github.com/onepremise/SGMS

Этот скрипт преобразует проекты, хранящиеся в SVN, в следующем формате:

 
/trunk
  /Project1
  /Project2
/branches
     /Project1
     /Project2
/tags
 /Project1
 /Project2

Эта схема также популярна и поддерживается:

 
/Project1
     /trunk
     /branches
     /tags
/Project2
     /trunk
     /branches
     /tags

Каждый проект будет синхронизирован по имени проекта:

 
Ex: ./migration https://svnurl.com/basepath project1

Если вы хотите преобразовать полный репо, используйте следующий синтаксис:

 
Ex: ./migration https://svnurl.com/basepath .
    
1
2012-02-16 18: 28: 52Z

Эффективное использование Git с Subversion - краткое введение в git-svn. Для существующих SVN-репозиториев git-svn делает это очень просто. Если вы запускаете новый репозиторий, гораздо проще сначала создать пустой SVN-репозиторий, а затем импортировать его с помощью git-svn, чем в противоположном направлении. Создание нового репозитория Git с последующим импортом в SVN, но яЭто немного больно, особенно если вы новичок в Git и надеетесь сохранить историю коммитов.

    
0
2015-11-17 21:20:47Z

Загрузите установщик Ruby для Windows и установите последнюю версию вместе с ним. Добавьте исполняемые файлы Ruby на свой путь.

  • Установите svn2git
  • Меню "Пуск" - > Все программы - > Рубин - > Запустите командную строку с Ruby
  • Затем введите «gem install svn2git» и введите

    Миграция хранилища Subversion

  • Откройте командную строку Ruby и перейдите в каталог, куда должны быть перенесены файлы

    Затем svn2git http: //[домен name] /svn /[корень хранилища]

  • Перенос проекта в Git может занять несколько часов в зависимости от размера кода проекта.

  • Этот важный шаг помогает создать структуру репозитория Git, как указано ниже.

    Ствол SVN (/Project_components) - > Git Master Ветви SVN (/Project_components) - > Git ветви Теги SVN (/Project_components) - > Git теги

Создайте удаленный репозиторий и отправьте изменения.

    
0
2015-11-17 21: 28: 44Z

У GitHub есть импортер. Создав репозиторий, вы можете импортировать его из существующего репозитория по его URL-адресу. Он запросит ваши учетные данные, если это применимо, и пойдет оттуда.

Во время работы он найдет авторов, и вы можете просто сопоставить их с пользователями на GitHub.

Я использовал его для нескольких репозиториев, и это довольно точно и намного быстрее! Это заняло 10 минут для репозитория с ~ 4000 коммитов, а после этого моему другу понадобилось четыре дня!

    
0
2015-11-17 21: 30: 42Z

Несколько ответов здесь приведены в https://github.com/nirvdrum/svn2git , но в целом репозитории это может быть медленным. Я попытался с помощью https://github.com/svn-all-fast-export/Вместо этого svn2git - инструмент с точно таким же именем, но использованный для переноса KDE из SVN в Git.

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

    
0
2016-01-19 14: 17: 52Z

Существуют разные методы для достижения этой цели. Я попробовал некоторые из них и нашел действительно работающий, только с установленными git и svn в ОС Windows.

Предварительные условия:

  1. git on windows (я использовал это) https://git-scm.com/
  2. svn с установленными консольными инструментами (я использовал svn для черепах)
  3. Файл дампа вашего репозитория SVN.  svnadmin dump /path/to/repository > repo_name.svn_dump

Шаги для достижения конечной цели (перенести весь репозиторий с историей в git, сначала локальный git, затем удаленный)

  1. Создайте пустой репозиторий (используя консольные инструменты или tortoiseSVN) в каталоге REPO_NAME_FOLDER  cd REPO_NAME_PARENT_FOLDER, поместите файл dumpfile.dump в REPO_NAME_PARENT_FOLDER

  2. svnadmin load REPO_NAME_FOLDER < dumpfile.dump Подождите, пока эта операция может быть долгой

  3. Эта команда молчит, поэтому откройте второе окно cmd: svnserve -d -R --root REPO_NAME_FOLDER Почему бы просто не использовать файл: ///......? Причина, по которой следующая команда завершится с ошибкой Unable to open ... to URL:, благодаря ответу https://stackoverflow.com/a/6300968/4953065

  4. Создать новую папку SOURCE_GIT_FOLDER

  5. cd SOURCE_GIT_FOLDER
  6. git svn clone svn: //localhost /Ожидание этой операции.

Наконец, что мы получили?

Давайте проверим наш локальный репозиторий:

 
git log

Видите свои предыдущие коммиты? Если да - хорошо

Итак, теперь у вас естьПолнофункциональный локальный репозиторий с вашими исходниками и старой историей SVN. Теперь, если вы хотите переместить его на какой-нибудь сервер, используйте следующие команды:

 
git remote add origin https://fullurlpathtoyourrepo/reponame.git
git push -u origin --all # pushes up the repo and its refs for the first time
git push -u origin --tags # pushes up any tags

В моем случае мне не нужна команда тегов, потому что в моем репозитории нет тегов.

Удачи!

    
0
2017-05-23 11: 47: 32Z

Преобразование подмодуля /папки svn 'MyModule' в git с историей без тегов или веток.

Чтобы сохранить список игнорируемых svn, используйте приведенные выше комментарии после шага 1

    
0
2016-06-07 16: 02: 29Z
источник размещен Вот