Как перенести репозиторий SVN с историей в новый репозиторий Git?
416950 просмотра
30 ответа
Я читал руководство Git, FAQ, Git-SVN crash course и т. Д., И все они объясняют это и это, но вы нигде не можете найти простую инструкцию:
Репозиторий 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
Я не ожидаю, что это будет так просто, и я не ожидаю, что это будет одна команда. Но я ожидаю, что он не попытается объяснить что-либо - просто сказать, какие шаги следует предпринять с учетом этого примера.
Автор: Milan Babuškov Источник Размещён: 17.05.2019 03:33Ответы (30)
502 плюса
Magic:
$ git svn clone http://svn/repo/here/trunk
Git и SVN работают по-разному. Вам нужно изучить Git, и если вы хотите отслеживать изменения из SVN вверх по течению, вам нужно учиться git-svn
. На git-svn
странице руководства есть хороший пример:
$ git svn --help
Автор: jfm3
Размещён: 17.09.2008 02:08
1491 плюса
Создайте файл пользователя (т. Е. 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 /, ветви /, теги / SVN. Если ваш макет отличается, ознакомятся с --tags
, --branches
, --trunk
варианты (в целом git svn help
).
Все общие протоколы допускаются: svn://
, http://
, https://
. URL-адрес должен быть нацелен на базовый репозиторий, например http://svn.mycompany.com/myrepo/repository . Это не должно включать /trunk
, /tag
или /branches
.
Обратите внимание, что после выполнения этой команды очень часто выглядит, как операция «зависает / замораживается», и вполне нормально, что она может застрять в течение долгого времени после инициализации нового репозитория. В конце концов вы увидите сообщения журнала, которые указывают, что он мигрирует.
Также обратите внимание, что если вы опустите --no-metadata
флаг, Git добавит информацию о соответствующей ревизии SVN в сообщение фиксации (т.е. git-svn-id: svn://svn.mycompany.com/myrepo/<branchname/trunk>@<RevisionNumber> <Repository UUID>
)
Если имя пользователя не найдено, обновите users.txt
файл:
cd dest_dir-tmp
git svn fetch
Возможно, вам придется повторять эту последнюю команду несколько раз, если у вас большой проект, пока не будут получены все транзакции Subversion:
git svn fetch
По завершении Git проверит SVN trunk
на новую ветку. Любые другие ветви настроены как пульт дистанционного управления. Вы можете просмотреть другие ветви SVN:
git branch -r
Если вы хотите сохранить другие удаленные ветви в своем репозитории, вы хотите создать локальную ветвь для каждого из них вручную. (Пропустить магистраль / мастер.) Если вы этого не сделаете, ветви не будут клонированы на последнем шаге.
git checkout -b local_branch remote_branch
# It'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
Автор: cmcginty
Размещён: 19.10.2010 07:45
184 плюса
Чисто перемещайте репозиторий 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
.
Если ваш репозиторий subversion находится на том же компьютере, что и ваш желаемый репозиторий git, вы можете использовать этот синтаксис для шага init, иначе все равно:
git svn init file:///home/user/repoName --no-metadata
Автор: Eugene Yokota
Размещён: 17.09.2008 02:10
68 плюса
Я использовал скрипт svn2git и работает как шарм! https://github.com/nirvdrum/svn2git
Автор: Thiago Leão Moreira Размещён: 01.02.2011 07:5357 плюса
Я предлагаю получить удовольствие от 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 remote branch »
Последующая работа для последней версии: « Время, чтобы сотрудничать с git_remote_branch »
Автор: webmat Размещён: 17.09.2008 06:2029 плюса
Существует новое решение для плавной миграции из Subversion в Git (или для одновременного использования обоих): SubGit .
Я сам работаю над этим проектом. Мы используем SubGit в наших репозиториях - некоторые из моих товарищей по команде используют Git и некоторую Subversion, и пока это работает очень хорошо.
Чтобы перейти из Subversion в Git с SubGit, вам нужно запустить:
$ subgit install svn_repos
...
TRANSLATION SUCCESSFUL
После этого вы получите репозиторий Git в svn_repos / .git и можете клонировать его или просто продолжать использовать Subversion и этот новый репозиторий Git вместе: SubGit будет следить за тем, чтобы оба они всегда синхронизировались.
Если репозиторий Subversion содержит несколько проектов, то в каталоге svn_repos / git будет создано несколько хранилищ Git. Чтобы настроить перевод перед запуском, выполните следующие действия:
$ subgit configure svn_repos
$ edit svn_repos/conf/subgit.conf (change mapping, add authors mapping, etc)
$ subgit install svn_repos
С SubGit вы можете перейти на чистую Git (не git-svn) и начать использовать его, сохраняя при этом Subversion столько, сколько вам нужно (для ваших уже настроенных инструментов сборки, например).
Надеюсь это поможет!
Автор: Alexander Kitaev Размещён: 24.11.2011 08:1217 плюса
См. Официальную справочную страницу git-svn . В частности, посмотрите в разделе «Основные примеры»:
Отслеживание и содействие всему проекту, управляемому Subversion (в комплекте с багажником, тегами и филиалами):
# Clone a repo (like git clone):
git svn clone http://svn.foo.org/project -T trunk -b branches -t tags
Автор: EfForEffort
Размещён: 17.09.2008 05:09
13 плюса
Pro Git 8.2 объясняет это: http://git-scm.com/book/en/Git-and-Other-Systems-Migrating-to-Git
Автор: kdahlhaus Размещён: 11.02.2011 09:1712 плюса
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 «фатальная ошибка».
ШАГОВ
2. Подготовьте команды переноса и обновления.
Предположим, мы делаем это для Windows (тривиально подключиться к Linux).
В каталоге bin инсталляции SubGit (subgit-2.XX \ bin) создайте два .bat-файла.
Содержимое файла / команды для переноса:
start subgit import --svn-url url://svn.serv/Bla/Bla directory/path/Local.git.Repo
Команда «start» здесь необязательна (Windows). Это позволит увидеть ошибки при запуске и оставить оболочку открытой после завершения SubGit.
Вы можете добавить дополнительные параметры, подобные git-svn . Я использую только -default-domain myCompanyDomain.com для исправления домена адреса электронной почты авторов SVN.
У меня есть стандартная структура репозитория SVN (trunk / branches / tags), и у нас не было проблем с «картированием авторов». Поэтому я больше ничего не делаю.
(Если вы хотите перенести теги, например ветви, или ваш SVN имеют несколько папок ветвей / тегов, вы можете рассмотреть возможность использования более подробного подхода SubGit )
Совет 1 : Используйте --minimal-revision YourSvnRevNumber, чтобы быстро увидеть, как все складывается (какая-то отладка). Особенно полезно видеть разрешенные имена авторов или электронные письма.
Или ограничить глубину истории миграции.
Совет 2 : Миграция может быть прервана ( Ctrl+ C) и восстановлена путем запуска следующей команды / файла обновления.
Я не советую делать это для больших репозиториев. Я получил «Исчерпывающее исключение Java + Windows».
Совет 3 : Лучше создать копию своего результирующего голого репозитория.
Содержимое файла / команды для обновления:
start subgit import directory/path/Local.git.Repo
Вы можете запускать его любое количество раз, когда вы хотите получить коммиты последней команды в свой репозиторий Git.
Предупреждение! Не трогайте свой голый репозиторий (например, создание ветвей).
Вы получите следующую фатальную ошибку:
Невосстановимая ошибка: не синхронизированы и не могут быть синхронизированы ... Перевод версий Subversion в Git коммит ...
3. Запустите первую команду / файл. Для большого хранилища потребуется время ожидания. 30 часов для моего скромного хранилища.
Это все.
Вы можете обновить свой репозиторий Git из SVN в любое время в любое время, запустив второй файл / команду. И перед переключением вашей команды разработчиков в Git.
Это займет несколько секунд.
Есть еще одна полезная задача.
Нажмите локальный репозиторий Git в удаленный репозиторий Git
Это ваш случай? Давайте продолжим.
- Настройка пультов
Бежать:
$ 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 ( бесполезно для меня ). Или вы можете создавать ветки из всех ваших тегов и нажимать их. Или, или, или ...
Автор: it3xl Размещён: 06.02.2015 11:129 плюса
reposurgeon
Для сложных случаев репозиторий Eric S. Raymond является инструментом выбора. В дополнение к SVN он поддерживает множество других систем управления версиями через fast-export
формат, а также CVS . Автор сообщает об успешных преобразованиях древних хранилищ, таких как Emacs и FreeBSD .
Инструмент, по-видимому, нацелен на почти идеальное преобразование (например, преобразование svn:ignore
свойств SVN в .gitignore
файлы) даже для сложных макетов репозитория с большой историей. Для многих случаев другие инструменты могут быть проще в использовании.
Прежде чем вникать в документацию reposurgeon
командной строки, обязательно прочитайте отличное руководство по миграции DVCS, которое постепенно переходит в процесс преобразования.
7 плюса
Это руководство на сайте atlassian является одним из лучших, которые я нашел:
https://www.atlassian.com/git/migration
Этот инструмент - https://bitbucket.org/atlassian/svn-migration-scripts - также очень полезен для генерации вашего authors.txt среди прочего.
Автор: Andrew B Размещён: 13.03.2014 01:586 плюса
Несколько расширенный ответ, используя только 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 branch --set-upstream master git-svn
git svn rebase
Обратите внимание, что для этого требуется Git 1.7 или выше.
Автор: thoutbeckers Размещён: 25.09.2013 09:236 плюса
Вы должны установить
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: игнорировать свойства в .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 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. Вы захотите переименовать его в стандартную «главную» ветку Git, используя:
cd ~/new-bare.git
git branch -m trunk master
6. Очистка ветвей и тегов
git-svn делает все теги Subversions в очень короткие ветви в Git формы «tags / name». Вы захотите преобразовать все эти ветви в реальные теги Git, используя:
cd ~/new-bare.git
git for-each-ref --format='%(refname)' refs/heads/tags |
cut -d / -f 4 |
while read ref
do
git tag "$ref" "refs/heads/tags/$ref";
git branch -D "tags/$ref";
done
Этот шаг займет немного ввода. :-) Но, не волнуйся; ваша оболочка unix предоставит> вторичное приглашение для команды extra-long, которая начинается с git for-each-ref.
Автор: Valarpirai Размещён: 22.07.2014 04:365 плюса
Теперь у GitHub есть функция для импорта из репозитория SVN . Я никогда не пробовал.
Автор: webmat Размещён: 21.09.2008 02:155 плюса
Мы можем использовать git svn clone
команды, как показано ниже.
svn log -q <SVN_URL> | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > authors.txt
Команда Above создаст файл авторов из SVN-коммитов.
svn log --stop-on-copy <SVN_URL>
Выше команда даст вам первый номер версии, когда ваш проект SVN будет создан.
git svn clone -r<SVN_REV_NO>:HEAD --no-minimize-url --stdlayout --no-metadata --authors-file authors.txt <SVN_URL>
Команда Above создаст репозиторий 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
команды.
Для получения полного примера обратитесь к моей записи в блоге .
Автор: Pankaj Размещён: 02.05.2016 04:134 плюса
TortoiseGit делает это. см. это сообщение в блоге: http://jimmykeen.net/articles/03-nov-2012/how-migrate-from-svn-to-git-windows-using-tortoise-clients
Да, я знаю, что ответ со ссылками не великолепный, но это решение, а?
Автор: CAD bloke Размещён: 18.04.2013 03:414 плюса
Я отправил пошаговое руководство ( здесь ), чтобы преобразовать 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) обновить мастер-ветку
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
Если вы хотите получить более подробную информацию, прочитайте мой пост или спросите меня.
Автор: Pablo Belaustegui Размещён: 24.02.2016 02:453 плюса
Я очень рекомендую эту короткую серию скринкастов, которые я только что обнаружил. Автор проводит основные операции и демонстрирует более продвинутые способы использования.
Автор: ripper234 Размещён: 22.03.2011 12:343 плюса
Если вы используете SourceTree, вы можете сделать это прямо из приложения. Goto File -> New / Clone, затем выполните следующие действия:
- Введите удаленный URL-адрес SVN в качестве «Исходный путь / URL-адрес».
- Введите свои учетные данные при появлении запроса.
- Введите локальную папку в качестве «Путь назначения».
- Дайте ему имя.
- В расширенных опциях выберите «Git» в раскрывающемся списке «Создать локальный репозиторий типа».
- Вы можете дополнительно указать версию для клонирования.
- Хит-клон.
Откройте репо в SourceTree, и вы увидите, что ваши сообщения о фиксации также были перенесены.
Перейдите в Репозиторий -> Настройки репозитория и добавьте новые данные удаленного репо. Удалите удаленный SVN, если хотите (я сделал это через параметр «Редактировать файл конфигурации».
Нажмите кнопку «Копировать» на новое дистанционное репо, когда вы будете готовы и код будет свободно.
Автор: Craig Myles Размещён: 17.06.2014 04:432 плюса
В другом случае команда git-stash - это находка, когда вы пытаетесь git с git-svn dcommits.
Типичный процесс:
- настроить git repo
- выполнять некоторые работы с разными файлами
- решите проверить часть работы, используя git
- решить
svn-dcommit
- получить страшную ошибку «не могу совершить с грязным индексом».
Решение (требуется git 1.5.3+):
git stash; git svn dcommit ; git stash apply
Автор: Gregg Lind
Размещён: 26.09.2008 01:13
2 плюса
Вот простой сценарий оболочки без зависимостей, которые преобразуют один или несколько репозиториев 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).
В итоге я объединил два коротких и простых сценария, связанных выше, и он отлично работает. Решение не должно быть более сложным, чем это!
Автор: NateS Размещён: 06.11.2013 02:062 плюса
Для пользователей 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. (См. Первую ссылку в разделе «Ссылки» для получения подробной информации, в частности, ответа пользователя Кейси).
Версии
- версия subversion 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
производит много выходных данных, включая некоторые предупреждения сверху; Я проигнорировал предупреждения.
1 плюс
Я просто хотел добавить свой вклад в сообщество 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 .
Автор: Jason Huntley
Размещён: 16.02.2012 06:28
1 плюс
Я на машине с 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>
Автор: cljk
Размещён: 06.02.2018 06:37
0 плюса
Эффективное использование Git с Subversion - нежное введение в git-svn. Для существующих репозиториев SVN git-svn делает это очень просто. Если вы начинаете новый репозиторий, гораздо проще сначала создать пустой репозиторий SVN, а затем импортировать с помощью git-svn, чем в противоположном направлении. Создание нового репозитория Git, а затем импорт в SVN можно сделать, но это немного больно, особенно если вы новичок в Git и надеетесь сохранить историю фиксации.
Автор: burkestar Размещён: 24.09.2010 02:130 плюса
Загрузите программу установки Ruby для Windows и установите с ней последнюю версию. Добавьте исполняемые файлы Ruby на свой путь.
- Установить svn2git
- Меню «Пуск» -> Все программы -> Ruby -> Запустите командную строку с Ruby
Затем введите «gem install svn2git» и введите
Перенос репозитория Subversion
Откройте командную строку Ruby и перейдите в каталог, в который должны быть перенесены файлы.
Затем svn2git http: // [ имя домена ] / svn / [корень репозитория]
Может потребоваться несколько часов для переноса проекта на Git, зависит от размера кода проекта.
Этот важный шаг помогает создать структуру репозитория Git, как указано ниже.
SVN (/ Project_components) -> Git master SVN (/ Project_components) ветви -> Git ветви SVN (/ Project_components) теги -> теги Git
Создайте удаленный репозиторий и нажмите изменения.
Автор: Nanda Размещён: 09.07.2015 01:190 плюса
У GitHub есть импортер. После создания репозитория вы можете импортировать из существующего репозитория через свой URL-адрес. Он попросит ваши учетные данные, если применимо, и оттуда.
По мере запуска он найдет авторов, и вы можете просто сопоставить их пользователям GitHub.
Я использовал его для нескольких репозиториев сейчас, и это довольно точно и намного быстрее! Потребовалось 10 минут для хранилища с ~ 4000 коммитов, и после того, как он взял моего друга четыре дня!
Автор: Josh Benson Размещён: 30.07.2015 02:560 плюса
Несколько ответов здесь относятся к https://github.com/nirvdrum/svn2git , но для больших репозиториев это может быть медленным. Вместо этого я попытался использовать https://github.com/svn-all-fast-export/svn2git, который является инструментом с точно таким же именем, но использовался для переноса KDE из SVN в Git.
Немного больше работы по настройке, но когда это было сделано, для меня для меня потребовалось несколько минут, когда другой сценарий проводил часы.
Автор: Zitrax Размещён: 19.01.2016 02:170 плюса
Для достижения этой цели существуют разные методы. Я пробовал некоторые из них и нашел действительно работающим с git и svn, установленным в ОС Windows.
Предпосылки:
- 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
В моем случае мне не нужна команда тегов, потому что у моего репо нет тегов.
Удачи!
Автор: Ruslan Makrenko Размещён: 15.02.2016 01:000 плюса
Преобразование svn subodule / folder 'MyModule' в git с историей без тегов и ветвей.
- git svn clone --no-metadata --trunk = SomeFolder1 / SomeFolder2 / SomeFolder3 / MyModule http: // svnhost: port / repo_root_folder / MyModule_temp -A C: \ cheetah \ svn \ authors-transform.txt
- git clone MyModule_temp MyModule
- cd MyModule
- git flow init
- git remote set-url origin https: //userid@stashhost/stash/scm/xyzxyz/MyModule.git
- git push -u начальный мастер
- git push -u origin develop
Чтобы сохранить список игнорирования svn, используйте приведенные выше комментарии после шага 1
Автор: PShetty Размещён: 07.06.2016 04:02Вопросы из категории :
- svn Как мне создать ветку?
- svn Как вы перемещаете файл?
- svn История изменений конкретной строки кода в Subversion
- svn Как переместить файл (или папку) из одной папки в другую в TortoiseSVN?
- svn Would all ally would wouldyy wouldy wouldy would ally would would wouldyyy would wouldy would wouldy would wouldyyyyy would would ally would would wouldyyyyyyyyyy wouldyy would wouldyyy wouldy would would would ally would ally would ally all all all
- git Как я могу отменить git reset --hard HEAD ~ 1?
- git Как настроить Git голый доступный по HTTP репозиторий на IIS
- git Как мне отменить неустановленные изменения в Git?
- git Как удалить локальные (неотслеживаемые) файлы из текущего рабочего дерева Git?
- git Как клонировать все удаленные ветки в Git?
- version-control Межотраслевое слияние в TFS?
- git-svn Как перенести репозиторий SVN с историей в новый репозиторий Git?
- git-svn Перенос существующего Git-репозитория в SVN
- git-svn git svn clone кроме определенной папки
- git-svn Git действительно медленный для 100 000 объектов. Какие-нибудь исправления?
- git-svn Как устранить несоответствие индекса git-svn?