Как перенести репозиторий 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

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

30 ответов


магия:

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

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

$ git svn --help

создать файл пользователей (т. е. 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("^ ", "", ); sub(" $", "", ); print " = "" <"">"}' | 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" флаг означает, что Вы имеют общий "ствол/ филиалы/ теги/" СВН макет. Если ваш макет отличается, ознакомьтесь с --tags, --branches, --trunk параметры (в общем git svn help).

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

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

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

если имя пользователя не найдено, обновите затем:

cd dest_dir-tmp
git svn fetch

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

git svn fetch

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

git branch -r

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

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

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

git checkout -b local_branch origin/remote_branch

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

git remote rm origin

чистый перенос репозитория Subversion в репозиторий Git. Сначала вам нужно создать файл, который сопоставляет имена авторов Subversion commit с Git commiters, скажем ~/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 хранилище, затем вы можете использовать этот синтаксис для шага init, иначе все равно:

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

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


Я предлагаю освоиться с 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 сотрудничать с git_remote_branch"


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

надеюсь, что это помогает!


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

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

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


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).
В установке SubGit bin каталог (subgit-2.X. X\bin), создайте два .Bat-файл.

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

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

команда "Пуск" здесь необязательна (Windows). Это позволит увидеть ошибки при запуске и оставить оболочку открытой после завершения подзаголовка.

вы можете добавить здесь дополнительные параметры, похожие на git-svn с. Я использую только --default-домен 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

это ваше дело? Давайте продолжим.

  1. настройка пультов

Run:

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

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

давайте побежим к нему:

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


reposurgeon

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

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

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


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

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

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


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

сначала используйте этот скрипт bash для сканирования SVN-РЕПО для разных людей, которые внесли свой вклад, и для создания шаблона для файла сопоставления:

#!/usr/bin/env bash
authors=$(svn log -q | grep -e '^r' | awk 'BEGIN { FS = "|" } ; { print  }' | 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 или выше.


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

git
git-svn

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

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

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

в корне локальной проверки Subversion выполните следующую команду:

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

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

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 (используя authors-transform.txt-файл, созданный на шаге 1) и поместите репозиторий git в папку "~/temp" внутри вашего домашнего каталога.

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

если ваше РЕПО svn использовало свойства svn: ignore, вы можете легко преобразовать это в a .файл 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 " в "master"

ваша основная ветвь разработки будет называться "trunk", которая соответствует имени, которое было в Subversion. Вы захотите переименовать его в стандартную ветку "master" 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 для-each-ref.


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


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

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

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

  • 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 в локальном.

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

$ 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 сэкономит вам много времени, и поэтому мне это нравится больше, чем собственные команды. Это хорошая обертка вокруг native .

для полного примера обратитесь к my запись в блог.


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

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


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

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/\(.*\)$# #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

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


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


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

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

Открытая РЕПО в программа и вы увидите, что ваши сообщения были перенесены.

Теперь перейдите в репозиторий - > настройки репозитория и добавьте новые данные удаленного РЕПО. Удалите SVN remote, если хотите (я сделал это через опцию" редактировать конфигурационный файл".

нажмите код на новый удаленный РЕПО, когда вы будете готовы и код свободно.


как еще один в сторону, команда git-stash является находкой при попытке git с git-svn dcommits.

процесс:

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

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

git stash; git svn dcommit ; git stash apply

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

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

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

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

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


на 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. (См. первую ссылку в разделе Ссылки на подробности, в частности ответ пользователя Casey).

версии

  • subversion версии 1.6.17 (r1128011)
  • git версии 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 web UI, и вы увидите все коммиты и файлы в списке.

Примечания

  • если есть неизвестные пользователи,git svn clone команда остановится, в этом случае update users.txt, cd favourite-project и git svn fetch продолжит с места остановки.
  • стандартный trunk-tags-branches требуется макет для репозитория SVN.
  • URL SVN, заданный git svn clone команда останавливается на уровне непосредственно над trunk/, tags/ и branches/.
  • на git svn clone команда производит много выходных данных, включая некоторые предупреждения вверху; я проигнорировал предупреждение.

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

Im на машине 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%

вам все еще нужны пользователям.txt с вашими пользовательскими сопоставлениями, такими как

User1 = User One <u.1@xxx.com>

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


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

  • установить svn2git
  • меню "Пуск" - > Все программы - > Ruby - > Запустите командную строку с помощью 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 в теги

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


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

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

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


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

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


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

требования:

  1. git на windows (я использовал этот)https://git-scm.com/
  2. svn с установленными консольными инструментами (я использовал tortoise 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.дамп в REPO_NAME_PARENT_FOLDER

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

  3. эта команда молчит, поэтому откройте второе окно cmd:svnserve -d -R --root REPO_NAME_FOLDER Почему бы просто не использовать file:///...... ? Потому что следующая команда не будет выполнена с 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

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

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

в моем случае мне не нужна команда тегов, потому что у моего РЕПО нет тегов.

удачи!


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

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