Как перенести репозиторий SVN с историей в новый репозиторий Git? - PullRequest
1459 голосов
/ 17 сентября 2008

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

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

Ответы [ 32 ]

2 голосов
/ 06 ноября 2013

Вот простой сценарий оболочки без зависимостей, который преобразует одно или несколько 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 была разбита всякая рубина, и заставить его работать на Windows было шуткой. Другие решения не смогли работать с путями Cygwin. Даже когда я что-то заработал, я не мог понять, как заставить теги отображаться на GitHub (секрет --follow-tags).

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

2 голосов
/ 06 февраля 2018

Я на машине с 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%

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

User1 = User One <u.1@xxx.com>
2 голосов
/ 26 сентября 2008

В качестве еще одного отступления команда 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
1 голос
/ 16 февраля 2012

Я просто хотел добавить свой вклад в сообщество 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 .
0 голосов
/ 11 февраля 2018

Для этого я использовал библиотеку svn2git со следующей процедурой:

sudo apt-get install git-core git-svn ruby ​​
sudo gem install svn2git
svn log --quiet | grep -E "r [0-9] + \ |. + \ |" | cut -d '|' -f2 | sed 's / // g' | сортировать | uniq >hors.txt (эта команда предназначена для отображения авторов)

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

Добавьте одно отображение на строку в author.txt, как это

anand = Anand Tripathi <email_id>
trip = Tripathi Anand <email_id>

Создайте папку для нового git-репозитория и выполните приведенную ниже команду, указав путь author.txt

svn2git <svn_repo_path> --nobranches --notags --notrunk --no-minimize-url --username <user_name> --verbose  --authors <author.txt_path>

If no trunk and no tag and branch is present then have to execute the above command else if root is trunk then mention rootistrunk or trunk is present then --trunk <trunk_name>

git remote add origin
git push - все происхождение
git push --tags origin

0 голосов
/ 03 января 2017

Я использовал следующий скрипт, чтобы прочитать текстовый файл со списком всех моих 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 голосов
/ 07 июня 2016

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

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

0 голосов
/ 24 сентября 2010

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

0 голосов
/ 15 февраля 2016

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

Пререквизиты:

  1. GIT на окнах (я использовал это) 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

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

Удачи!

0 голосов
/ 19 января 2016

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

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

...