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

Я прочитал руководство по Git, FAQ, Git - SVN и т.д., и все они объясняют то и это, но нигде не найти такой простой инструкции, как:

SVN хранилище в: svn://myserver/path/to/svn/repos

Git репозиторий в: git://myserver/path/to/git/repos

git-do-the-magic-svn-import-with-history \
svn://myserver/path/to/svn/repos \
git://myserver/path/to/git/repos

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

17.09.2008 02:04:20
Становится легче, я просто завершил это сам и задокументировал свои выводы с помощью SO jmoses.co/2014/03/21/moving-from-svn-to-git.html
John Moses 21.03.2014 21:20:59
Используйте ответ Кейси ниже, но перед тем, как запустить команду «svn clone ...», посмотрите, как добавить дополнительную строку «Visual SVN Server» в ваш файл user.txt ... здесь: stackoverflow.com/questions/8971208/ …
MacGyver 9.02.2016 07:21:55
Кроме того, если в вашем профиле GitHub установлен флажок «сделать личную почту закрытым», используйте его в качестве адреса электронной почты в users.txt для соответствия. Yourgituser@users.noreply.github.com, чтобы ваш реальный адрес электронной почты не отображался о коммитах
MacGyver 9.02.2016 07:39:11
30 ОТВЕТОВ
РЕШЕНИЕ

Magic:

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

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

$ git svn --help
527
9.09.2019 10:42:14
Ответ @Casey гораздо лучше отвечает на оригинальный вопрос.
Doug Wilson 26.02.2012 14:58:03
Будет ли это держать ветви и все? или просто клонировать багажник?
Eildosa 25.09.2012 19:16:44
@Eildosa: это просто клонирует ствол. Смотрите ответ Кейси для альтернативы.
sleske 10.08.2013 13:30:13
@DougWilson, но я не вижу ответа Кейси здесь. Это ответ ниже с 13 авторами, который начинается с "Создать файл пользователя"?
Andrey Regentov 5.08.2016 08:50:24
Для всех, кому интересно, что такое «ответ Кейси», на который ссылаются во многих комментариях, именно этот (Кейси изменил свой ник на cmcginty).
Stefan Monov 5.10.2016 10:35:36

Чисто перенесите свой репозиторий 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-репозиторий, то вы можете использовать этот синтаксис для этапа инициализации, в противном случае все то же самое:

git svn init file:///home/user/repoName --no-metadata
194
29.08.2019 11:25:40
Как я прокомментировал другой ответ, я должен был удалить пробела вокруг =в users.txtпотому , что импорт был прерывание , и я получаю пустой репозиторий.
Sebastián Grignoli 31.01.2013 03:08:31
Ах! Простое и эффективное объяснение. В моем случае file:///отказался работать, просто я использовал, svnserve.exe --daemonа затем использовал svn://localhost/home/user/repoвместо.
Daniel Reis 5.06.2013 12:13:44
На моем Mac под управлением Mountain Lion git svn не будет работать, пока я не зайду в Xcode и не установлю инструменты командной строки, найденные на вкладке «Загрузки» панели «Настройки». В качестве альтернативы я мог бы установить только инструменты командной строки для OS X Mountain Lion, которые можно найти на сайте разработчиков Apple.
Drew 23.08.2013 13:21:43
Для моего случая мне пришлось конвертировать файл authors.txtв utf-8 without BOM.
Silvan 25.11.2015 10:31:05
Это отлично сработало для меня! После того, как у меня появился локальный репозиторий, я использовал пост cmcginty, начинающийся с «Клонировать свой GIT-SVN-репозиторий в чистый Git-репозиторий:« Я думаю, что основной причиной, по которой мне понравился ответ @zoul, было использование git svn init, а git svn configзатем, наконец, git svn fetchтак проще чтобы сделать это таким образом, я должен был получить несколько раз, чтобы сделать это правильно. Единственная строка cmcginty git svn clone, которая выполняет все три, была слишком запутанной для меня.
mike 9.01.2017 19:36:23

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

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

# Clone a repo (like git clone):
    git svn clone http://svn.foo.org/project -T trunk -b branches -t tags
19
6.10.2008 15:38:32
Ваша команда клонов сработала, те, что выше, не дали мне ничего, кроме пустых репозиториев. Похоже, единственное различие заключается в явном '-T trunk'.
user1984717 26.11.2019 01:02:06

Я предлагаю освоиться с 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_remote_branch »

58
18.09.2012 17:00:54
Очень полезно, это работало отлично. Я хотел бы добавить, что есть один последний шаг, если вы синхронизируете данные с удаленным репозиторием. После шагов git config мне нужно былоgit push origin master
mag382 24.10.2012 15:17:35

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

7
21.09.2008 02:15:07
Текущая рекомендация GitHub - использовать svn2gitпрограмму, предложенную в другом ответе .
ntc2 30.01.2014 02:42:24
Импортировано два довольно больших проекта только сейчас без нареканий. Все ветки SVN были импортированы (только помните, что НЕ используйте \ trunk в пути репо). Одна вещь, которую я пока не знаю, это то, будет ли Github отслеживать новые коммиты.
Fr0sT 11.08.2014 12:15:35

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

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

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

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

git stash; git svn dcommit ; git stash apply
2
26.09.2008 13:13:26

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

0
17.11.2015 21:20:47

Создайте файл пользователей (то есть 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 /, branch /, 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

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

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

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

git checkout -b local_branch origin/remote_branch

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

git remote rm origin
1552
15.01.2018 09:36:14
Этот пост в блоге Eelke является отличной перекрестной ссылкой на ответ выше. blokspeed.net/blog/2010/09/converting-from-subversion-to-git
kgriffs 6.03.2012 16:13:12
Это на 99% круто, выполнив эти шаги, я получил все в порядке, кроме веток: после последнего шага они были только удаленными (и как таковые исчезли, когда я выполнил команду: git remote rm origin)
Dirty Henry 29.03.2012 09:22:59
GitHub имеет очень удобный шаг за шагом: github.com/nirvdrum/svn2git#readme
Dan Nissenbaum 17.10.2012 14:11:38
Для тех, кто работает под Windows, я создал сценарий PowerShell на основе этого метода: gist.github.com/Gimly/90df046dc38181bb18de
Gimly 16.06.2014 09:42:31
Предупреждение для больших репо с большой историей, это медленно и утомительно . Я отказался от попыток перенести все старые ветки и просто перенес ствол.
Jess 4.09.2015 13:01:00

Я использовал скрипт svn2git и работает как шарм.

70
23.11.2018 14:29:00
Q: это исправляет пробелы в именах тегов и веток (разрешено в svn и не разрешено в git)?
spazm 4.06.2011 19:16:55
Это руководство по его использованию полезно: troyhunt.com/2014/08/migrating-from-subversion-to-git-with.html
Morten Holmgaard 8.02.2015 19:25:18
Для меня это не помогло с проблемой: groups.google.com/forum/#!topic/msysgit/7MQVwRO-2N4 - см. Также: github.com/nirvdrum/svn2git/issues/50 Решение было здесь: stackoverflow.com/questions / 3009738 /…
HDave 8.12.2016 16:03:34
Желательно, чтобы объяснить ответы, иначе мы производим сценариев детишек.
Josh Habdas 24.06.2017 04:19:02
Что делать, если все ваши ветки находятся в корне SVN и у вас нет транка или тегов?
Kal 6.12.2017 12:34:13
14
17.09.2012 16:19:10
Объяснение Pro Git включает перенос тегов и веток. Он использует локальные команды mv, а не svn. умная.
spazm 4.06.2011 19:19:44

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

3
22.03.2011 00:34:48

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

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

31
23.11.2018 07:49:45
Обратите внимание, что однократный импорт (с использованием subgit importкоманды) даже не требует лицензии. Точный перевод svn:ignoreсвойства в .gitignoreфайлы также включен.
krlmlr 4.03.2015 22:26:59
SubGit не распознает ни мой закрытый ключ, ни какие-либо флаги, которые я установил в командной строке. Документация очень плохая. Это не жизнеспособная альтернатива для git svn.
pfnuesel 16.06.2015 11:43:08
ошибка: 'svn_repos' не является допустимым настроенным местоположением; Файл конфигурации SubGit отсутствует.
Jon Davis 6.11.2015 19:37:38

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

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

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

5
18.04.2013 03:41:17
Попробуйте машину обратного хода на archive.org
CAD bloke 10.05.2019 20:08:42

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

7
29.10.2013 10:41:21
Я хотел бы предложить объединить эту информацию с этой ссылкой: sailmaker.co.uk/blog/2013/05/05/…
Joan P.S 11.11.2013 10:09:10

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

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

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

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

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

2
6.11.2013 14:11:59
Я использовал этот скрипт. После небольшого количества ошибок и ошибок это сработало для меня. Обратите внимание, что для этого вам нужен Git 1.8.3+ , так как --follow-tags поддерживается только после этого.
nrobey 17.02.2014 19:41:24

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

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

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

8
13.03.2014 13:58:34
Эта страница замечательна, и это ИМХО лучший ответ! Это делает большую часть тяжелой работы для вас.
PfunnyGuy 6.08.2018 16:38:16

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

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

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

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

Нажмите код для нового удаленного репо, когда вы будете готовы и код свободно.

3
17.06.2014 04:43:33
Спасибо, супер и просто!
Rikard 23.06.2014 12:40:31
Спасибо. Это сработало для меня. Я использую SourceTree и Stash.
VK_217 20.10.2015 16:21:18

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

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

Это захватит все сообщения журнала, вычеркнет имена пользователей, удалит любые дубликаты имен пользователей, отсортирует имена пользователей и поместит их в файл «hors-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 (с использованием файла author-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.

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

Ваша основная ветка разработки будет называться «стволом», что соответствует имени, которое было в 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.

8
22.07.2014 04:36:33

Для пользователей 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выводит много информации, включая некоторые предупреждения в верхней части; Я проигнорировал предупреждения.
3
4.05.2015 21:21:16
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится.
Blackhole 4.05.2015 21:09:35
Я не согласен. Связанный контент может измениться, и дублированный здесь контент не будет обновлен, и, следовательно, может быть устаревшим (и фактически я считаю, что он изменился с тех пор, как я первоначально опубликовал этот ответ). В руководящих принципах говорится только о том, чтобы включить какой-то релевантный контекст для ссылки, что я и сделал - на настоящий вопрос была дана полная ссылка. Копирование всего связанного ресурса здесь не является обязательным или необходимым. Был ли я за это проголосовал ?!
leftclickben 6.05.2015 06:38:11

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 « слишком длинное имя файла ».

ШАГОВ

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 (ствол / ветви / теги), и у нас не было проблем с «отображением авторов». Так что я больше ничего не делаю.

(Если вы хотите перенести теги, такие как ветви, или ваш 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)

Если вы получаете следующее: error: not not spit git: Нет такого файла или каталога ... Для меня полное воссоздание моего хранилища решает эту ошибку (30 часов). Вы можете попробовать следующие команды

git push origin --all
git push origin --tags

Или попробуйте переустановить Git ( для меня бесполезно ). Или вы можете создавать ветви из всех ваших тегов и нажимать их. Или, или, или ...

14
23.05.2017 12:18:30

reposurgeon

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

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

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

10
17.11.2015 21:34:36

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

  • Установите svn2git
  • Меню Пуск -> Все программы -> Ruby -> Запустить командную строку с Ruby
  • Затем введите «gem install svn2git» и введите

    Migrate Subversion хранилище

  • Откройте командную строку Ruby и перейдите в каталог, куда должны быть перенесены файлы

    Затем svn2git http: // [ имя домена ] / svn / [корень хранилища]

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

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

    Ствол SVN (/ Project_components) -> Git master Ветки SVN (/ Project_components) -> Git ветви Теги SVN (/ Project_components) -> Теги Git

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

0
17.11.2015 21:28:44

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

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

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

0
17.11.2015 21:30:42

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

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

0
19.01.2016 14:17:52

Существуют разные методы для достижения этой цели. Я попробовал некоторые из них и нашел действительно работающий, только с установленным 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 почему бы просто не использовать file: /// ......? Потому что следующая команда не удастся Unable to open ... to URL:, благодаря ответу https://stackoverflow.com/a/6300968/4953065

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

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

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

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

git log

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

Итак, теперь у вас есть полностью функциональный локальный репозиторий git с вашими исходниками и старой историей SVN. Теперь, если вы хотите переместить его на какой-нибудь сервер, используйте следующие команды:

git remote add origin https://fullurlpathtoyourrepo/reponame.git
git push -u origin --all # pushes up the repo and its refs for the first time
git push -u origin --tags # pushes up any tags

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

Удачи!

0
23.05.2017 11:47:32

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

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

7
25.02.2016 20:27:14

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

Теперь отправьте master, ветви и теги в удаленный репозиторий git.

$ git push origin master MyDevBranch MyDevBranch-1.0
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (14/14), 2.28 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To https://github.com/pankaj0323/JDProjects.git
 * [new branch]      master -> master
 * [new branch]      MyDevBranch -> MyDevBranch
 * [new tag]         MyDevBranch-1.0 -> MyDevBranch-1.0
$

утилита svn2git

Утилита svn2git удаляет ручные операции с ветками и тегами.

Установите его с помощью команды sudo gem install svn2git. После этого запустите команду ниже.

  • $ svn2git <SVN_URL> --authors authors.txt --revision <SVN_REV_NO>

Теперь вы можете перечислять ветки, теги и легко нажимать их.

$ git remote add origin https://github.com/pankaj0323/JDProjects.git
$ git branch -a
  MyDevBranch
* master
  remotes/svn/MyDevBranch
  remotes/svn/trunk
$ git tag
  MyDevBranch-1.0
$ git push origin master MyDevBranch MyDevBranch-1.0

Представьте, что у вас 20 веток и тегов, очевидно, что svn2git сэкономит вам много времени, и поэтому мне это нравится больше, чем нативные команды. Это хорошая оболочка для родной git svn cloneкоманды.

Для полного примера, обратитесь к моей записи в блоге .

6
2.05.2016 16:13:49

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

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

0
7.06.2016 16:02:29

Я использовал следующий скрипт, чтобы прочитать текстовый файл со списком всех моих SVN-репозиториев и преобразовать их в Git, а затем использовать git clone --bareдля преобразования в пустой Git-репозиторий:

#!/bin/bash
file="list.txt"
while IFS= read -r repo_name
do
 printf '%s\n' "$repo_name"
 sudo git svn clone --shared --preserve-empty-dirs --authors-file=users.txt file:///programs/svn/$repo_name
 sudo git clone --bare /programs/git/$repo_name $repo_name.git
 sudo chown -R www-data:www-data $repo_name.git
 sudo rm -rf $repo_name
done <"$file"

list.txt имеет формат:

repo1_name
repo2_name

И users.txt имеет формат:

(no author) = Prince Rogers <prince.rogers.nelson@payesley.park.org>

www-data является пользователем веб-сервера Apache, и для продвижения изменений по HTTP требуется разрешение.

0
7.12.2017 14:42:25