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

StackOverflow https://stackoverflow.com/questions/79165

Вопрос

Я прочитал руководство по 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

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

Это было полезно?

Решение

Магия:

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

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

$ 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("^ ", "", $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/, Branches/, 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

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

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 с коммиттерами Git, скажем ~/authors.txt:

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

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

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

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

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

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

Я использовал 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 — некоторые из моих товарищей по команде используют 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

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

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

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

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

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

СубГит (против «Синего экрана смерти»)

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 миграция занимает много времени.
Но обновление завершенной миграции занимает всего несколько секунд.

Конечно, я использую СубГит, мама.git-svn заставляет меня Синий экран смерти.Просто постоянно.А git-svn меня утомляет Git"имя файла слишком длинное" фатальная ошибка.

ШАГИ

1. Скачать SubGit

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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

Бегать:

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

рехирург

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

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

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

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

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

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

Вам необходимо установить

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("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > authors-transform.txt

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

jwilkins = jwilkins <jwilkins>

в это:

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

2.Клонируйте репозиторий Subversion с помощью git-svn

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

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

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

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

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

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

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

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.Вы захотите переименовать ее в стандартную «главную» ветку Git, используя:

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

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

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

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

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

В GitHub теперь есть возможность импорт из репозитория SVN.Хотя я никогда этого не пробовал.

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

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

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

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

Тогда имейте git svn клонируйте репозиторий svn в репозиторий git, сообщив ему о сопоставлении:

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

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

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

git svn rebase --continue

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

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

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

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

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

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

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

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

git svn rebase

4) Создайте локальные ветки из веток svn, скопировав ссылки.

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

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

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

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

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

Если хотите подробнее, читайте мой почта или спроси меня.

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

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

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

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

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

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

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

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

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

Для тегов:

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

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

  git checkout -b new_branch_name

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

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

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

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

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

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

Если вы используете SourceTree, вы можете сделать это прямо из приложения.Перейдите в «Файл» -> «Создать/Клонировать», затем выполните следующие действия:

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

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

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

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

Для 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.(Подробную информацию см. в первой ссылке в разделе «Ссылки», в частности, в ответе пользователя Кейси).

Версии

  • подверсия версии 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 git@git.domain.com.au:dev-team/favourite-project.git
git push --set-upstream gitlab master

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

Примечания

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

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

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

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

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

git stash; git svn dcommit ; git stash apply

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

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

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

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

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

Я работаю на машине с 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%

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

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

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

Эффективное использование 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://[домен имя]/svn/ [корень репозитория]

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

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

    SVN (/project_components) Trunk -> Git Master Svn (/project_components) Branches -> Git Branches Svn (/project_components) Теги -> Tags GIT

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

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

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

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

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

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

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

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

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

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

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

  2. svnadmin load REPO_NAME_FOLDER < dumpfile.dump Подождите этой операции, она может занять много времени.

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

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

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

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

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

git log

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top