Как мне экспортировать (а затем импортировать) репозиторий Subversion?

82

Я почти завершил проект, в котором я использовал коммерческого поставщика SVN для хранения исходного кода. Веб-хостинг, который в конечном итоге выбрал клиент, включает репозиторий как часть пакета хостинга, поэтому теперь, когда проект завершен, я хотел бы переместить репозиторий на его веб-хост и прекратить коммерческую учетную запись.

Как бы я это сделал?

Брайан Уоршоу
источник

Ответы:

69

Если вы хотите переместить репозиторий и сохранить историю, вам, вероятно, понадобится доступ к файловой системе на обоих хостах. Самое простое решение, если ваш бэкэнд - FSFS (по умолчанию в последних версиях), - это сделать копию файловой системы всей папки репозитория.

Если у вас есть серверная часть Berkley DB, если вы не знаете, что это за серверная часть, или если вы меняете номера версий SVN, вы захотите использовать svnadmin, чтобы сбросить старый репозиторий и загрузить его в новый. репозиторий. Использование svnadmin dumpдаст вам одну резервную копию файла, которую вы можете скопировать в новую систему. Затем вы можете создать новый (пустой) репозиторий и использовать его svnadmin load, который будет воспроизводить все коммиты вместе с его метаданными (автор, временная метка и т. Д.).

Вы можете узнать больше о процессе дампа / загрузки здесь:

http://svnbook.red-bean.com/en/1.8/svn.reposadmin.maint.html#svn.reposadmin.maint.migrate

Кроме того, если вы это сделаете svnadmin load, убедитесь, что вы используете эту --force-uuidопцию, иначе у людей возникнут проблемы с переключением на новый репозиторий. Subversion использует UUID для внутренней идентификации репозитория и не позволяет вам переключить рабочую копию в другой репозиторий.

Если у вас нет доступа к файловой системе, могут быть другие сторонние варианты (или вы можете написать что-нибудь), которые помогут вам выполнить миграцию: по сути, вам придется использовать журнал svn для воспроизведения каждой ревизии в новом репозитории и затем исправьте метаданные после этого. Для этого вам понадобятся сценарии ловушек pre-revprop-change и post-revprop-change, что предполагает доступ к файловой системе, поэтому YMMV. Или, если вы не хотите сохранять историю, вы можете использовать свою рабочую копию для импорта в новый репозиторий. Но, надеюсь, это не так.

Тадмас
источник
28
Начиная с версии 1.7 вы можете использовать svnrdump, который не требует прав администратора для удаленных репозиториев. Команда легко: svnrdump dump https//remote/svn/trunk > repos.dump. В большинстве случаев команда работает и с SVN 1.6, но могут иметь некоторые проблемы, см. Документацию. Работает как в * nix, так и в Windows.
Абель
34

rsvndump отлично сработал для меня при переносе репозитория с svnrepository.com на сервер Ubuntu, который я контролирую.

Как установить и использовать rsvndump в Ubuntu:

  1. Установите недостающие зависимости (библиотеки APR и Subversion)

    sudo apt-get install apache2-threaded-dev
    sudo apt-get install libsvn-dev
    
  2. Установить rsvndump

    wget http://prdownloads.sourceforge.net/rsvndump/rsvndump-0.5.5.tar.gz
    tar xvfz rsvndump-0.5.5.tar.gz
    cd rsvndump-0.5.5
    ./configure
    make
    sudo make install
    
  3. Выгрузить удаленный репозиторий SVN в локальный файл

    rsvndump http://my.svnrepository.com/svn/old_repo > old_repo_dump
    
  4. Создайте новый репозиторий и загрузите в локальный файл дампа

    sudo svnadmin create /opt/subversion/my_new_rep
    sudo svnadmin load --force-uuid /opt/subversion/my_new_repo < old_repo_dump
    
tkdave
источник
7
Затем, чтобы перенести существующую рабочую копию: svn switch --relocate http://my.svnrepository.com/svn/old_repo http://newserver.com/svn/my_new_repo
tkdave
Что именно означает опция force-uuid? Копирует ли он права доступа к каталогу из источника или что-то еще?
Montag451
1
UUID - это «универсальный уникальный идентификатор» репозитория. Вы не можете переключиться на перемещенный репозиторий, если не совпадает UUID. Обратите внимание: также можно установить UUID позже с помощью команды svnadmin setuuid.
tkdave
9

Выдержка из моей заметки в блоге :

Теперь вы можете импортировать файл дампа, например, если вы переходите между машинами / версиями Subversion. например, если бы я создал файл дампа из исходного репозитория и загрузил его в новый репозиторий, как показано ниже.

Команды для Unix-подобных систем (из терминала):

svnadmin dump /path/to/your/old/repo > backup.dump
svnadmin load /path/to/your/new/repo < backup.dump.dmp

Команды для систем Microsoft Windows (из cmd shell):

svnadmin dump C:\path\to\your\old\repo > backup.dump
svnadmin load C:\path\to\your\old\repo < backup.dump
Гишу
источник
5

Инструмент для этого был бы

svnadmin dump

Но для того, чтобы это работало, вам необходим доступ файловой системы к репозиторию. И как только он у вас есть (и при условии, что репозиторий находится в формате FSFS), вы можете просто скопировать репозиторий в новое место (если он в формате BDB, настоятельно рекомендуется дамп / загрузка).

Если у вас нет доступа к файловой системе, вам придется попросить поставщика репозитория предоставить вам дамп (и заставить их удалить свой репозиторий - и надеяться, что они подчинятся)

пилиф
источник
5

Если у вас нет файлового доступа к репозиторию, я предпочитаю rsvndump (удаленный дамп репозитория Subversion) для создания файла дампа.

Рэй
источник
Я узнал об этом на собственном горьком опыте, сегодня выяснилось, что новые svns думают, что старые репозитории повреждены. Использование дампов решило эту проблему.
Owl
4

В принципе, есть много способов выполнить задачу. Эта тема подробно освещена в SVNBook | Перенос данных репозитория в другое место, поэтому я предлагаю прочитать раздел книги.

Вот краткое описание ваших вариантов:

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

  • Вы можете использовать svnadmin dumpи svnadmin loadкоманды для, ЭУ, генерировать полный дамп , а затем загрузить его в другое хранилище на другом сервере. Вам понадобится svnadmin createновый чистый репозиторий, чтобы загрузить в него дамп. Имейте в виду, что этот подход имеет дело только с историей репозитория и не перемещает скрипты ловушек и файлы конфигурации репозитория ! Кроме того, вы должны иметь доступ для чтения файловой системы к исходному репозиторию, чтобы выгрузить его.

  • Начиная с Subversion 1.7, svnrdumpинструмент доступен. Вообще говоря, он имитирует svnadmin dumpи svnadmin loadфункционирует, но работает удаленно. Вам не требуется иметь доступ к файловой системе для чтения / записи к исходным и целевым репозиториям, поскольку инструмент работает удаленно, как клиент Subversion, например, по протоколу HTTPS. Таким образом, вам необходимо иметь доступ для чтения к исходному репозиторию и для чтения / записи в целевой.

  • Другой вариант - использовать svnadmin hotcopyкоманду. Команда в основном используется для резервного копирования, она создает полную копию репозитория, включая скрипты конфигурации и ловушки. После этого вы можете переместить репозиторий с горячим копированием на другой сервер.

бахреп
источник
4

Вы также можете использовать svnadmin hotcopyкоманду:

svnadmin hotcopy OLD_REPOS_PATH NEW_REPOS_PATH

Требуется полная резервная копия из репозитория, включая все перехватчики, файлы конфигурации и т. Д.

Подробнее на SVN Book

пирхо
источник
1
на самом деле это горячая копия svnADMIN. Это означает, что для этого также потребуется доступ к файловой системе репозитория!
pilif
3

Предполагая, что у вас есть необходимые привилегии для запуска svnadmin, вам нужно использовать команды dump и load .

Дэн Дайер
источник
3

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

  1. Определите, где вы будете хранить свои репозитории:

    mkdir ~/repo
    MYREPO=/home/me/someplace ## you should use full path here
    
  2. Теперь создайте пустой репозиторий svn с помощью svnadmin create $MYREPO
  3. Создайте файл ловушки и сделайте его исполняемым:

    echo '#!/bin/sh' > $MYREPO/hooks/pre-revprop-change
    chmod +x $MYREPO/hooks/pre-revprop-change
    
  4. Теперь мы можем начать импорт репозитория с svnsync, что инициализирует целевой репозиторий для синхронизации из другого репозитория:

    svnsync init file://$MYREPO http://your.svn.repo.here/
    
  5. И последний штрих, чтобы перенести все ожидающие изменения в место назначения из источника, с помощью которого он был инициализирован:

    svnsync sync file://$MYREPO
    

Теперь у вас есть локальный репозиторий svn в ~/repoкаталоге.

Источник:

Braiam
источник