Як експортувати (а потім імпортувати) сховище 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
    

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

Витяг з мого блогу-Примітка до себе :

Тепер ви можете імпортувати файл дампа, наприклад, якщо ви переходите між машинами / версіями диверсії. наприклад, якби я створив дамп-файл із вихідного сховища та завантажив його у нове сховище, як показано нижче.

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

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

Команди для систем Microsoft Windows (із оболонки cmd):

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) для створення файлу дампа.


Я дізнався про це важким шляхом сьогодні, виявилося, що нові свінни вважають, що старі репозиції корумповані. За допомогою дампів це вирішено.
Сова

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каталозі.

Джерело:


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.