Як зробити копію віддаленого репозиторію Subversion

13 серпня 2008 р

Резервна копія репозиторію Subversion, що знаходиться на локальній машині, робиться зазвичай так:

Все просто, достатньо мати прямий доступ до каталогу з репозиторієм.

На жаль, для віддалених репозиторіїв, керованих кимось іншим (наприклад, code.google.com ), такий фокус не проходить. А якось неспокійно на душі, коли нема своєї копії. Проте проходять фокуси зі створенням локального «дзеркала» (копії) віддаленого репозиторію, з яким потім можна робити все, що завгодно.

Фокусів тут можна зробити цілих два.

Вміст віддаленого SVN-репозиторію можна легко перенести у локальний SVK-репозиторій. SVK – це система керування версіями, яка використовує сховище SVN. Тобто, фактично, лише надбудова над Subversion .

Отже, щоб фокус вийшов, спочатку видаляємо локальний SVK-репозиторій (звичайно, якщо в ньому немає нічого цінного):

(ствердно відповідаємо на всі питання; svk створює локальний репозиторій з копією змін із віддаленого SVN-репозиторію).

Тепер залишилося зробити резервну копію:

(Створюємо dump всіх змін, ігноруючи перші дві ревізії SVK-репозиторія, які до наших справ не мають відношення).

Дізнався про такий фокус тут.

SVK легко користуватися, але, на жаль, SVK не зберігає номери ревізій SVN. Тому для точного дзеркалювання репозиторію він годиться.

Тут допоможе може прийти інший інструмент: svnsync, що з'явився в Subversion починаючи з версії 1.4. svnsync призначений для одностороннього дзеркалювання репозиторіїв SVN (тобто створення репозиторіїв-клонів, призначених лише читання).

Для початку створимо новий репозиторій, куди все копіюватимемо. Це описано в документації Subversion:

Не використовуйте вяк дзеркало вже існуючі репозиторії! svnsync може повністю перезаписати їх вміст.

Після цього робимо порожній "хук" у локальному репозиторії-дзеркалі:

Далі ініціалізуємо репозиторій-дзеркало:

Щоб розпочати передачу даних (синхронізувати репозиторій-дзеркало з віддаленим), слід виконати таку команду:

У деяких випадках (наприклад, якщо попередня синхронізація обірвалася аварійно), svnsync може скаржитися на те, що не може заблокувати репозиторій-дзеркало. У цих випадках допомагає така команда:

Оскільки я зазвичай синхронізую репозиторії автоматично, crontab , в скрипті для синхронізації репозиторіїв пишу так: