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

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

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

Ответ 2

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

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

Вы можете использовать этот однострочный шаблон для создания шаблона из существующего хранилища 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 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

Ответ 3

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

git svn init file:///home/user/repoName --no-metadata

Ответ 5

Я предлагаю вам комфортно работать с 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"

Ответ 6

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

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

Ответ 7

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

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

# Clone a repo (like git clone):
    git svn clone http://svn.foo.org/project -T trunk -b branches -t tags

Ответ 9

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

Ответ 10

reposurgeon

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

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

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

Ответ 12

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

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.

Ответ 14

Несколько расширенный ответ, используя только 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 <[email protected]>";
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 или выше.

Ответ 15

Я опубликовал пошаговое руководство (здесь) для преобразования 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) обновлять ветку master

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

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

Ответ 16

Мы можем использовать команды 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.

В качестве полного примера см. запись .

Ответ 18

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

Ответ 19

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

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

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

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

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

Ответ 20

Для пользователей 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 производит много выходных данных, включая некоторые предупреждения сверху; Я проигнорировал предупреждения.

Ответ 21

Как и в другом случае, команда 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

Ответ 22

Вот простая оболочка 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 (секрет - это теги -пользователи).

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

Ответ 23

Я на 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 <[email protected]>

Ответ 24

Я просто хотел добавить свой вклад в сообщество 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 .

Ответ 25

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

Ответ 26

Загрузите программу установки 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 теги

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

Ответ 27

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

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

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

Ответ 28

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

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

Ответ 29

Существуют различные способы достижения этой цели. Я пробовал некоторые из них и нашел действительно работающий с только 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:, благодаря ответу fooobar.com/questions/2824/...

  • Создать новую папку 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

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

Удачи!

Ответ 30

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

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