Если нельзя, но очень хочется, то нужно обязательно и ничего в мире не стоит того, чтобы делать из этого проблему!


Интересна Java? Кликай по ссылке и изучай!
Если тебе полезно что-то из того, чем я делюсь в своем блоге - можешь поделиться своими деньгами со мной.
с пожеланием
столько времени читатели провели на блоге - 
сейчас онлайн - 

вторник, 13 декабря 2011 г.

How to: Как выкачать SVN репозиторий с history через http?

Если нет доступа к серверу, а есть только url на Svn репозиторий и очень надо получить у себя на локали репозиторий со всей историей коммитов, то поможет git :)

Как его установить - вопрос сюда. Под windows довольно тривиальная установка. Я себе поставил


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

Открываем Git Bash (в меню Пуск можно найти :))


И в консоли набираем

git svn clone http://host/blablabla/blabla --no-metadata

где  http://host/blablabla/blabla путь к репозиторию.

Далее мы увидим, как ревизия за ревизией все подтянется на наш локальный репозиторий в GIT


Быть может тебя спросят пароль - это самое худшее, что со мной случилось...

Далее у тебя на виртуальном диске, который создал GIT появится новая папка, а в ней проект и папочка .git, содержащая сам репозиторий. Контекстное меню откроет возможность работать с новоиспеченным локальным git-репозиторием


В принципе уже сейчас можно остановиться :) Но если хочется получить SVN репозиторий, тогда стоит потрудиться еще немного...

Может случиться так, что ты получишь сообщение об ошибке в процессе миграции.
Couldn't open a repository: Unable to open an ra_local session to URL: 
Unable to open repository 'file:///D:/BlaBLaBLa': Expected FS format '2'; 
found format '4' at C:\Program Files (x86)\Git/libexec/git-core\git-svn line 2139
Лечится. Устанавливаем VisualSVN, копируем в его папку repositories (при установке указывается путь) исходный svn репозиторий. А потом выполняем команду (где host - то, что предложит VisualSVN, а SourceRepo - имя исходного репозитория)
git svn clone https://host:8443/svn/SourceRepo/ --no-metadata
Быть может если и это не поможет - стоит обратиться к другому SVN серверу или же установить друугую версию git клиента. В общем, пошаманить с версиями прийдется...

Случается со временем даже так, что VisualSVN и другие svn сервера не устанавливаются (я перешел на Windows8 чтоб её). Тогда приходится выкручиться с помощью временного репозитория на google code.

Допустим репозиторий находится в папке file:///D:/BlaBLaBLa
Создадим проект bla-bla-temp на http://code.google.com
После откроем cmd и введем такие команды
D:\>svnsync init --allow-non-empty --username user@gmail.com https://bla-bla-temp.googlecode.com/svn file:///D:/BlaBLaBLa
svnsync: warning: W200007: Target server does not support atomic revision proper
ty edits; consider upgrading it to 1.7 or using an external locking program
Authentication realm:  Google Code
Subversion Repository
Password for 'user@gmail.com': ********************
Copied properties for revision 1.

D:\>svnsync sync --username user@gmail.com https://bla-bla-temp.googlecode.com/svn
svnsync: warning: W200007: Target server does not support atomic revision proper
ty edits; consider upgrading it to 1.7 or using an external locking program
Committed revision 2.
Copied properties for revision 2.
Committed revision 3.
Copied properties for revision 3.
Committed revision 4.
...
Ну а потом уже git svn clone http://bla-bla-temp.googlecode.com
И естественно удалить временный репозиторий, чтобы не захламлять интернет :)

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

12 комментариев:

  1. Хочется получить SVN репозиторий? Не уверен что понял правильно, но например в TortoiseSVN есть возможность создать локальный однопользовательский SVN repository без необходимости ставить что-то ещё

    ОтветитьУдалить
  2. Ну, допустим, у тебя есть линк на какой-то там сервер где находится проект. Физического доступа к репозиторию у тебя нет - просто нет доступа к файлам сервера. Но у тебя есть http (или https) линк, по которому ты можешь выкачать себе последнюю версию (или любую другу ревизию с помощью той же тортилки).

    Но я не хочу полную версию - я хочу всю историю. Допустим, админ собирается сносить репозиторий. А тебе он нужен. Что делать?

    Вариант 1 - просить админа, чтобы он забекапил репозиторий и переслал тебе результат.

    Вариант 2 - выкачать репозиторий себе довольствуясь тем общедоступным http линком.

    Прием

    ОтветитьУдалить
  3. Понятно ) ) Идею статьи понял только в последнюю фразу не въехал ) видимо читал невнимательно!
    Ты сделал Git репозиторий на основе удалённого SVN а дальше хочешь SVN репо сделать (в следующей версии)

    Я вспомнил что когда читал SVN-книжку онлайн наталкивался на название утилиты которая по идее умеет делать то что ты хочешь -
    Вот линк
    http://svnbook.red-bean.com/en/1.4/svn.ref.svnsync.html

    ОтветитьУдалить
  4. Та да, с git сходу не все так просто - пока не прочитаешь мануалы нифига не получится - как слепой котенок. Потому я взял таймаут. Благо миссия выполнена - репозитории сохранил, доступ к истории имею.

    А что касается твоей тулзовинки - именно ее я и искал, но чет не нашел. Ты разбирался с ней? Толковая?

    ОтветитьУдалить
  5. интересно хочу тоже гит глянуть пока ещё не пробовал
    А тулзовинку не копал ) только теоретически читал что она для синхронизации СВНов удаленного и локального когда есть доступ только для чтения

    ОтветитьУдалить
  6. Отсутствие выбора по причине незнания

    ОтветитьУдалить
  7. А зачем обратно SVN из гит получать?

    ОтветитьУдалить
  8. Вообще-то незачем. История есть и ладно. Но для полноты картины стоило бы сделать и обратную операцию. Кстати, она сложнее чем прямая.

    ОтветитьУдалить
  9. Зачем? Коммитите в git, потом делаете push в svn. Все работает как часы. Я уже больше года использую git как клиент для svn.

    ОтветитьУдалить
  10. А для чего --no-metadata? Чем эта опция помогла?

    ОтветитьУдалить
  11. Думаю тебе это поможет. В моем случае это был копипаст.

    ОтветитьУдалить