Вопрос:

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

svn git version-control git-svn

416950 просмотра

30 ответа

33795 Репутация автора

Я читал руководство 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.09.2008 02:04

Ответы (30)


502 плюса

24612 Репутация автора

Решение

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

184 плюса

72581 Репутация автора

Чисто перемещайте репозиторий 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

17 плюса

54665 Репутация автора

См. Официальную справочную страницу 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

57 плюса

25323 Репутация автора

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

5 плюса

25323 Репутация автора

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

Автор: webmat Размещён: 21.09.2008 02:15

2 плюса

12830 Репутация автора

В другом случае команда git-stash - это находка, когда вы пытаетесь git с git-svn dcommits.

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

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

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

git stash; git svn dcommit ; git stash apply
Автор: Gregg Lind Размещён: 26.09.2008 01:13

0 плюса

652 Репутация автора

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

Автор: burkestar Размещён: 24.09.2010 02:13

1491 плюса

56078 Репутация автора

Создайте файл пользователя (т. Е. 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

68 плюса

432 Репутация автора

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

Автор: Thiago Leão Moreira Размещён: 01.02.2011 07:53

13 плюса

446 Репутация автора

Pro Git 8.2 объясняет это: http://git-scm.com/book/en/Git-and-Other-Systems-Migrating-to-Git

Автор: kdahlhaus Размещён: 11.02.2011 09:17

3 плюса

88327 Репутация автора

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

Автор: ripper234 Размещён: 22.03.2011 12:34

29 плюса

675 Репутация автора

Существует новое решение для плавной миграции из 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:12

1 плюс

2984 Репутация автора

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

4 плюса

5265 Репутация автора

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

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

Автор: CAD bloke Размещён: 18.04.2013 03:41

6 плюса

1903 Репутация автора

Несколько расширенный ответ, используя только 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:23

2 плюса

4325 Репутация автора

Вот простой сценарий оболочки без зависимостей, которые преобразуют один или несколько репозиториев 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:06

7 плюса

1088 Репутация автора

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

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

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

Автор: Andrew B Размещён: 13.03.2014 01:58

3 плюса

897 Репутация автора

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

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

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

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

Нажмите кнопку «Копировать» на новое дистанционное репо, когда вы будете готовы и код будет свободно.

Автор: Craig Myles Размещён: 17.06.2014 04:43

6 плюса

1 Репутация автора

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

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:36

2 плюса

3734 Репутация автора

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

12 плюса

696 Репутация автора

SubGit (против синего экрана смерти)

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

Это все.

+ Для обновления из SVN - репозитория Git, созданного первой командой.

subgit import  directory/path/Local.git.Repo

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

Вот мой путь.

Мое решение выглядит так:

  • Перенести SVN в репозиторий Git
  • Обновите репозиторий Git перед переходом команды .

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

Конечно, я использую SubGit , мама. git-svn делает меня синим экраном смерти . Просто постоянно. И git-svn раздражает меня с « длинной » ошибкой Git «фатальная ошибка».

ШАГОВ

1. Загрузите SubGit

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

Предположим, мы делаем это для Windows (тривиально подключиться к Linux).
В каталоге 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

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

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

Автор: it3xl Размещён: 06.02.2015 11:12

9 плюса

14630 Репутация автора

reposurgeon

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

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

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

Автор: krlmlr Размещён: 20.03.2015 06:20

0 плюса

50 Репутация автора

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

0 плюса

1 Репутация автора

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

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

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

Автор: Josh Benson Размещён: 30.07.2015 02:56

0 плюса

8596 Репутация автора

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

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

Автор: Zitrax Размещён: 19.01.2016 02:17

0 плюса

947 Репутация автора

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

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

  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

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

Удачи!

Автор: Ruslan Makrenko Размещён: 15.02.2016 01:00

4 плюса

1 Репутация автора

Я отправил пошаговое руководство ( здесь ), чтобы преобразовать 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:45

5 плюса

2818 Репутация автора

Мы можем использовать 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:13

0 плюса

300 Репутация автора

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

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

Автор: PShetty Размещён: 07.06.2016 04:02

1 плюс

716 Репутация автора

Я на машине с 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
Вопросы из категории :
32x32