Как перенести репозиторий SVN с историей в новый репозиторий Git?
-
09-06-2019 - |
Вопрос
Я прочитал руководство по 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-svn
.А git-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
Pro Git 8.2 объясняет это:http://git-scm.com/book/en/Git-and-Other-Systems-Migration-to-Git
СубГит (против «Синего экрана смерти»)
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"имя файла слишком длинное" фатальная ошибка.
ШАГИ
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.
Это ваш случай?Давайте продолжим.
- Настройте свои пульты
Бегать:
$ git remote add origin url://your/repo.git
- Подготовьтесь к первоначальной отправке вашего огромного локального репозитория Git в удаленный репозиторий.
По умолчанию ваш Git не может отправлять большие фрагменты.фатально:Удаленный конец неожиданно завис
Давайте побежим:
git config --global http.postBuffer 1073741824
524288000 - 500 МБ 1073741824 - 1 ГБ и т. Д.
Исправьте свой локальный проблемы с сертификатом.Если ваш git-сервер использует сломанный сертификат.
я отключил сертификаты.
Также ваш сервер Git может иметь ограничения суммы запроса необходимо исправить.
- Нажать всю миграцию в удаленный репозиторий 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, вы можете сделать это прямо из приложения.Перейдите в «Файл» -> «Создать/Клонировать», затем выполните следующие действия:
- Введите URL-адрес удаленного SVN в качестве «Исходного пути/URL».
- Введите свои учетные данные при появлении запроса.
- Введите местоположение локальной папки в качестве «Пути назначения».
- Дайте ему имя.
- В расширенных параметрах выберите «git» из раскрывающегося списка «Создать локальный репозиторий типа».
- При желании вы можете указать ревизию для клонирования.
- Нажмите «Клонировать».
Откройте репозиторий в 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.
Типичный процесс:
- настроить git-репо
- поработать над разными файлами
- решили проверить часть работы, используя git
- решить
svn-dcommit
- получите ужасную ошибку «невозможно зафиксировать с грязным индексом».
Решение (требуется 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.
Предпосылки:
- git для Windows (я использовал этот) 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_FOLDERsvnadmin load REPO_NAME_FOLDER < dumpfile.dump
Подождите этой операции, она может занять много времени.Эта команда не работает, поэтому откройте второе окно cmd:
svnserve -d -R --root REPO_NAME_FOLDER
Почему бы просто не использовать файл:///......?Причина: следующая команда завершится неудачно сUnable to open ... to URL:
, спасибо за ответ https://stackoverflow.com/a/6300968/4953065Создайте новую папку 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
В моем случае мне не нужна команда тегов, потому что в моем репо нет тегов.
Удачи!
Преобразование подмодуля/папки svn «MyModule» в git с историей без тегов и ветвей.
- git svn clone-no-metadata-drunk = somefolder1/somefolder2/somefolder3/mymodule http://svnhost:port/repo_root_folder/MyModule_temp -A c: cheetah svn outrors-transform.txt
- git clone MyModule_temp MyModule
- компакт-диск MyModule
- инициализация потока git
- Git удаленный источник set-urlhttps://userid@stashhost/stash/scm/xyzxyz/MyModule.git
- git push -u мастер происхождения
- git push -u origin development
Чтобы сохранить список игнорирования svn, используйте приведенные выше комментарии после шага 1.