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

1312

Я читал 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

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

  • 6
    Становится легче, я просто завершил это сам и задокументировал свои выводы с помощью SO jmoses.co/2014/03/21/moving-from-svn-to-git.html
  • 0
    Используйте ответ Кейси ниже, но перед тем, как запустить команду «svn clone ...», посмотрите, как добавить дополнительную строку «Visual SVN Server» в ваш файл user.txt ... здесь: stackoverflow.com/questions/8971208/ ...
Показать ещё 1 комментарий
Теги:
svn
version-control
git-svn

30 ответов

488
Лучший ответ

Magic:

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

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

$ git svn --help
  • 0
    Я думаю, используйте CPAN для установки модуля Error. Вы можете использовать git-svn для одноразовой миграции.
  • 0
    @Milan: я получаю эту ошибку, когда Perl-привязки Subversion не установлены.
Показать ещё 9 комментариев
1314

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

user1 = First Last Name <[email protected]>
user2 = First Last Name <[email protected]>
...

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

svn log --xml | grep "<author>" | sort -u | perl -pe 's/.*>(.*?)<.*/$1 = /' | tee 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/, ветки /, теги/SVN. Если ваш макет отличается, ознакомьтесь с параметрами --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

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

git checkout -b local_branch remote_branch
# It 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

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

git checkout -b local_branch origin/remote_branch

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

git remote rm origin
  • 1
    Большое спасибо за это! Я сделал все основные шаги по импорту, а затем заметил, что все мои ветви были удаленными и не знал, что делать, чтобы решить эту проблему.
  • 34
    Этот пост от Eelke - отличная перекрестная ссылка на ответ выше. blokspeed.net/blog/2010/09/converting-from-subversion-to-git
Показать ещё 28 комментариев
172

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

jmaddox = Jon Maddox <[email protected]>
bigpappa = Brian Biggs <[email protected]>

Затем вы можете загрузить данные 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 то вы можете использовать этот синтаксис для шага init, иначе все равно:

git svn init file:///home/user/repoName --no-metadata
  • 1
    Как я прокомментировал другой ответ, мне пришлось удалить пробелы вокруг = в users.txt потому что импорт прерывался, и я получал пустой репозиторий.
  • 7
    Ах! Простое и эффективное объяснение. В моем случае file:/// отказался работать, просто я использовал svnserve.exe --daemon а затем использовал svn://localhost/home/user/repo .
Показать ещё 5 комментариев
61

Я использовал svn2git script и работает как шарм! https://github.com/nirvdrum/svn2git

Показать ещё 3 комментария
56

Я предлагаю вам комфортно работать с 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 [email protected]:user/project-name.git

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

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

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

Первое объяснительное сообщение: Git удаленные ветки

Последующая работа для последней версии: " Время Git, сотрудничающее с git_remote_branch"

  • 0
    Очень полезно, это работало отлично. Я хотел бы добавить, что есть один последний шаг, если вы синхронизируете данные с удаленным репозиторием. После шагов git config мне нужно было git push origin master
25

Появилось новое решение для плавной миграции из Subversion в Git (или для одновременного использования): SubGit (http://subgit.com/).

Я сам работаю над этим проектом. Мы используем 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 столько, сколько вам нужно он (для ваших уже настроенных инструментов сборки, например).

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

  • 4
    Обратите внимание, что однократный импорт (с использованием команды subgit import ) даже не требует лицензии. Точный перевод свойства svn:ignore в файлы .gitignore включен.
  • 1
    SubGit не распознает ни мой закрытый ключ, ни какие-либо флаги, которые я установил в командной строке. Документация очень плохая. Это не жизнеспособная альтернатива для git svn .
Показать ещё 1 комментарий
15

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

Отслеживание и внесение вклада в весь проект, управляемый Subversion (полный     с багажником, тегами и ветками):

# Clone a repo (like git clone):
    git svn clone http://svn.foo.org/project -T trunk -b branches -t tags
13
  • 1
    Объяснение Pro Git включает перенос тегов и веток. Он использует локальные команды mv, а не svn. умная.
12

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 "filename слишком долго" фатальная ошибка.

ШАГОВ

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

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

Скажем, мы делаем это для Windows (это тривиально для порта Linux).
В каталоге SubGit bin (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. Я использую только - default-domain myCompanyDomain.com, чтобы исправить домен адреса электронной почты авторов SVN.
У меня есть стандартная структура репозитория SVN (trunk/branches/tags), и у нас не было проблем с "составлением карт". Поэтому я больше ничего не делаю.

(Если вы хотите перенести теги, например ветки, или ваш 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

Это ваш случай? Продолжим.

  • Настройте свои пульты

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 (бесполезно для меня). Или вы можете создавать ветки из всех ваших тегов и нажимать их. Или, или, или...

7

reposurgeon

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

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

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

7

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

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

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

  • 0
    Эта страница замечательна, и это ИМХО лучший ответ! Это делает большую часть тяжелой работы для вас.
6

Вам нужно установить

git
git-svn

Скопировано по этой ссылке http://john.albin.net/git/convert-subversion-to-git.

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

Subversion просто перечисляет имя пользователя для каждой фиксации. Git s commits имеет гораздо более богатые данные, но по своему простейшему автору фиксации необходимо указать имя и адрес электронной почты. По умолчанию инструмент 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

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

jwilkins = jwilkins <jwilkins>

в это:

jwilkins = John Albin Wilkins <[email protected]>

2. Clone the Subversion repository с помощью git -svn

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

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

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

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

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

4. Push-репозиторий в голый репозиторий Git

Во-первых, создайте голый репозиторий и сделайте его ответное ветвление по умолчанию svns "trunk" .

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

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

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

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

5. Переименуйте ветвь "trunk" на "master"

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

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

6. Очистка ветвей и тегов

git -svn делает все теги Subversions в очень короткие ветки в Git формы "tags/name". Youll хочет преобразовать все эти ветки в фактические теги 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 предоставит > вторичное приглашение для команды extra-long, которая начинается с Git for-each-ref.

6

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

Сначала используйте этот bash script для сканирования вашего 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 или выше.

  • 0
    Я бы предложил объединить эту информацию с этой ссылкой: sailmaker.co.uk/blog/2013/05/05/…
5

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

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

Команда Above создаст файл авторов из 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
$

Теперь нажмите мастер, ветки и теги на удаленный репозиторий 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

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

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

5

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

  • 3
    Текущая рекомендация GitHub - использовать программу svn2git предложенную в другом ответе .
  • 0
    Импортированы два довольно больших проекта только сейчас без нареканий. Все ветки SVN были импортированы (только помните, что НЕ используйте \ trunk в пути репо). Одна вещь, которую я пока не знаю, это то, будет ли Github отслеживать новые коммиты.
4

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

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

1) clone 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 [email protected]:aUser/aProjectName.git
git push newrepo refs/heads/*
git push --tags newrepo

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

3

Если вы используете SourceTree, вы можете сделать это непосредственно из приложения. Goto File → New/Clone, затем выполните следующие действия:

  • Введите удаленный URL-адрес SVN в качестве "Путь/URL-адрес источника".
  • Введите свои учетные данные при появлении запроса.
  • Введите локальное расположение папки в качестве "Целевой маршрут".
  • Дайте ему имя.
  • В расширенных опциях выберите "Git" в выпадающем меню "Создать локальный репозиторий типа ".
  • Вы можете опционально указать версию для клонирования.
  • Хит-клон.

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

Теперь перейдите в Репозиторий → Настройки репозитория и добавьте новые данные удаленного репо. Удалите удаленный SVN, если хотите (я сделал это через параметр "Изменить файл конфигурации".

Введите код в новое дистанционное репо, когда вы будете готовы и код свободно.

  • 0
    Спасибо, супер и просто!
  • 0
    Спасибо. Это сработало для меня. Я использую SourceTree и Stash.
3

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

2

Для пользователей 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 [email protected]).
    • Проект favourite-project создается в пространстве имен dev-team.
  • В файле users.txt содержатся соответствующие данные пользователя, один пользователь в строке, формы username = First Last <[email protected]>, где username - это имя пользователя, указанное в журналах SVN. (См. Первую ссылку в разделе "Ссылки" для получения подробной информации, в частности, ответа пользователя Кейси).

Версия

  • subversion version 1.6.17 (r1128011)
  • git версия 1.9.1
  • GitLab версия 7.2.1 ff1633f
  • Сервер Ubuntu 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 [email protected]: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 производит много выходных данных, включая некоторые предупреждения сверху; Я проигнорировал предупреждения.
  • 0
    Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными в случае изменения связанной страницы.
  • 1
    Я не согласен. Связанный контент может измениться, и дублированный здесь контент не будет обновлен, и, следовательно, может быть устаревшим (и фактически я считаю, что он изменился с тех пор, как я первоначально опубликовал этот ответ). В руководящих принципах говорится только о том, чтобы включить какой-то релевантный контекст для ссылки, что я и сделал - на настоящий вопрос ссылка была дана оптом. Копирование всего связанного ресурса здесь не является обязательным или необходимым. Был ли я за это проголосовал ?!
Показать ещё 1 комментарий
2

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

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

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

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

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

  • 2
    Я использовал этот скрипт. После небольшого количества ошибок и ошибок это сработало для меня. Обратите внимание, что для этого вам нужен Git 1.8.3+ , так как --follow-tags поддерживается только после этого.
2

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

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

  • настроить git repo
  • выполните некоторые работы с различными файлами
  • решите проверить часть работы, используя git
  • выберите svn-dcommit
  • получить страшную ошибку "can not commit with dirty index".

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

git stash; git svn dcommit ; git stash apply
1

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

https://github.com/onepremise/SGMS

Этот script преобразует проекты, хранящиеся в 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 .
0

Я использовал следующий script для чтения текстового файла, который имеет список всех моих SVN-репозиториев и конвертирует их в GIT, а затем использует git clone --bare для преобразования в голый git репо

 #!/bin/bash
file="list.txt"
while IFS= read -r repo_name
do
 printf '%s\n' "$repo_name"
 sudo git svn clone --shared --preserve-empty-dirs --authors-file=users.txt file:///programs/svn/$repo_name
 sudo git clone --bare /programs/git/$repo_name $repo_name.git
 sudo chown -R www-data:www-data $repo_name.git
 sudo rm -rf $repo_name
done <"$file"

list.txt имеет формат

repo1_name
repo2_name

и users.txt имеет формат

(no author) = Prince Rogers <[email protected]>

www-data - пользователь веб-сервера Apache, требуется разрешение для изменения изменений по HTTP

0

Преобразование svn subodule/folder 'MyModule' в git с историей без тегов и ветвей.

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

0

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

Предпосылки:

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

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

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

  • svnadmin load REPO_NAME_FOLDER < dumpfile.dump Дождитесь этой операции, она может быть длинной

  • Эта команда отключена, поэтому откроется второе окно cmd: svnserve -d -R --root REPO_NAME_FOLDER Почему бы просто не использовать файл:///......? Причина: следующая команда завершится с ошибкой Unable to open ... to URL:, благодаря ответу https://stackoverflow.com/questions/5113170/git-svn-is-unable-to-fetch-from-svn-repository

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

  • cd SOURCE_GIT_FOLDER
  • git svn clone svn://localhost/Дождитесь этой операции.

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

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

git log

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

Итак, теперь у вас есть полностью функциональный локальный репозиторий git с вашими источниками и старой историей 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

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

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

0

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

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

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

0

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

  • Установить svn2git
  • Меню "Пуск" → Все программы → Ruby → Запустите командную строку с Ruby
  • Затем введите "gem install svn2git" и введите

    Миграция репозитория Subversion

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

    Затем svn2git http://[domain name]/svn/[корень репозитория]

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

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

    Строка SVN (/Project_components) → Git master Ветви SVN (/Project_components) → Git Теги SVN (/Project_components) → Git теги

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

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню