Jak wyeksportować (a następnie zaimportować) repozytorium Subversion?

82

Jestem prawie zajęty projektem, w którym korzystałem z komercyjnego dostawcy SVN do przechowywania kodu źródłowego. Host sieciowy, który ostatecznie wybrał klient, zawiera repozytorium jako część pakietu hostingowego, więc teraz, gdy projekt dobiegł końca, chciałbym przenieść repozytorium do ich hosta internetowego i zrezygnować z konta komercyjnego.

Jak bym to zrobił?

Brian Warshaw
źródło

Odpowiedzi:

69

Jeśli chcesz przenieść repozytorium i zachować historię, prawdopodobnie będziesz potrzebować dostępu do systemu plików na obu hostach. Najprostszym rozwiązaniem, jeśli twój backend to FSFS (domyślny w ostatnich wersjach), jest utworzenie kopii systemu plików całego folderu repozytorium.

Jeśli masz zaplecze Berkley DB, jeśli nie jesteś pewien, jaki jest twój backend lub jeśli zmieniasz numery wersji SVN, będziesz chciał użyć svnadmin, aby zrzucić stare repozytorium i załadować je do nowego magazyn. Użycie svnadmin dumpda ci kopię zapasową jednego pliku, którą możesz skopiować do nowego systemu. Następnie możesz utworzyć nowe (puste) repozytorium i użyć svnadmin load, które zasadniczo odtworzy wszystkie zatwierdzenia wraz z metadanymi (autor, znacznik czasu itp.).

Możesz przeczytać więcej o procesie zrzutu / ładowania tutaj:

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

Ponadto, jeśli to zrobisz svnadmin load, upewnij się, że korzystasz z tej --force-uuidopcji, w przeciwnym razie ludzie będą mieli problemy z przejściem do nowego repozytorium. Subversion używa UUID do wewnętrznej identyfikacji repozytorium i nie pozwala na przełączenie kopii roboczej do innego repozytorium.

Jeśli nie masz dostępu do systemu plików, mogą istnieć inne opcje stron trzecich (lub możesz coś napisać), które pomogą ci w migracji: zasadniczo musiałbyś użyć dziennika svn, aby odtworzyć każdą wersję w nowym repozytorium, i następnie popraw metadane. Będziesz potrzebować skryptów przechwytujących przed revprop-change i post-revprop-change, aby to zrobić, które zakładają dostęp do systemu plików, więc YMMV. Lub, jeśli nie chcesz zachować historii, możesz użyć kopii roboczej do importu do nowego repozytorium. Ale miejmy nadzieję, że tak nie jest.

Tadmas
źródło
28
Od wersji 1.7 możesz teraz svnrdump, który nie wymaga uprawnień administratora w zdalnych repozytoriach. Polecenie to jest proste: svnrdump dump https//remote/svn/trunk > repos.dump. W większości przypadków polecenie działa również z SVN 1.6, ale mogą wystąpić pewne problemy, zobacz dokumentację. Działa zarówno w * nix, jak i Windows.
Abel
34

rsvndump działało świetnie dla mnie migracja repozytorium z svnrepository.com na serwer Ubuntu, który kontroluję.

Jak zainstalować i używać rsvndump na Ubuntu:

  1. Zainstaluj brakujące zależności (biblioteki „APR” i Subversion)

    sudo apt-get install apache2-threaded-dev
    sudo apt-get install libsvn-dev
    
  2. Zainstaluj 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. Zrzuć zdalne repozytorium SVN do pliku lokalnego

    rsvndump http://my.svnrepository.com/svn/old_repo > old_repo_dump
    
  4. Utwórz nowe repozytorium i wczytaj do lokalnego pliku zrzutu

    sudo svnadmin create /opt/subversion/my_new_rep
    sudo svnadmin load --force-uuid /opt/subversion/my_new_repo < old_repo_dump
    
tkdave
źródło
7
Następnie, aby przeprowadzić migrację istniejącej kopii roboczej: svn switch --relocate http://my.svnrepository.com/svn/old_repo http://newserver.com/svn/my_new_repo
tkdave
Co dokładnie oznacza opcja force-uuid? Czy kopiuje uprawnienia katalogu ze źródła, czy coś innego?
Montag451
1
UUID to „uniwersalny, niepowtarzalny identyfikator” repozytorium. Nie możesz przełączyć się do przeniesionego repozytorium, chyba że identyfikator UUID jest zgodny. Uwaga, możliwe jest również późniejsze ustawienie identyfikatora UUID za pomocą polecenia svnadmin setuuid.
tkdave
9

Fragment mojej notatki z bloga dla siebie :

Teraz możesz zaimportować plik zrzutu, np. Jeśli migrujesz między maszynami / wersjami subversion. np. gdybym utworzył plik zrzutu z repozytorium źródłowego i załadował go do nowego repozytorium, jak pokazano poniżej.

Polecenia dla systemów uniksopodobnych (z terminala):

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

Polecenia dla systemów Microsoft Windows (z powłoki cmd):

svnadmin dump C:\path\to\your\old\repo > backup.dump
svnadmin load C:\path\to\your\old\repo < backup.dump
Gishu
źródło
5

Narzędziem do tego byłoby

svnadmin dump

Ale żeby to zadziałało, potrzebujesz dostępu do systemu plików do repozytorium. A kiedy już to zrobisz (i pod warunkiem, że repozytorium jest w formacie FSFS), możesz po prostu skopiować repozytorium do nowej lokalizacji (jeśli jest w formacie BDB, zdecydowanie zalecamy zrzut / załadowanie).

Jeśli nie masz dostępu do systemu plików, musisz poprosić dostawcę repozytorium o dostarczenie zrzutu (i zmusić go do usunięcia repozytorium - i mieć nadzieję, że się zgodzą)

pilif
źródło
5

Jeśli nie masz dostępu do plików w repozytorium, wolę rsvndump (zdalny zrzut repozytorium Subversion), aby utworzyć plik zrzutu.

Promień
źródło
Dowiedziałem się tego na własnej skórze. Dzisiaj okazało się, że nowe svny uważają, że stare repozytoria są uszkodzone. Użycie zrzutów rozwiązało ten problem.
Owl
4

Zasadniczo istnieje wiele sposobów wykonania zadania. Temat jest szczegółowo omówiony w SVNBook | Migracja danych repozytorium w inne miejsce , więc sugeruję przeczytanie sekcji książki.

Oto krótki opis dostępnych opcji:

  • To zależy od twojego środowiska, ale jest duża szansa, że ​​możesz po prostu skopiować repozytorium na nowy serwer i będzie działać. Musisz zweryfikować skrypty przechwytujące repozytorium po skopiowaniu repozytorium, aby upewnić się, że działają zgodnie z oczekiwaniami.

  • Możesz użyć poleceń svnadmin dumpi svnadmin load, ehm, wygenerować pełny zrzut, a następnie załadować go do innego repozytorium na innym serwerze. Będziesz potrzebował svnadmin createnowego, czystego repozytorium, aby załadować zrzut do niego. Należy pamiętać, że podejście to dotyczy tylko historii repozytorium i nie przenosi skryptów przechwytujących ani plików konfiguracyjnych repozytorium ! Ponadto, aby zrzucić je, musisz mieć dostęp do systemu plików do odczytu z oryginalnego repozytorium.

  • Od Subversion 1.7 svnrdumpnarzędzie jest dostępne. Ogólnie rzecz biorąc, naśladuje svnadmin dumpi svnadmin loadfunkcjonuje, ale działa zdalnie. Nie musisz mieć dostępu do systemu plików do odczytu / zapisu do oryginalnych i docelowych repozytoriów, ponieważ narzędzie działa zdalnie jak klient Subversion, np. Przez protokół HTTPS. Musisz więc mieć dostęp do odczytu do oryginalnego repozytorium i do odczytu / zapisu w docelowym.

  • Inną opcją jest użycie svnadmin hotcopypolecenia. Polecenie jest głównie używane do tworzenia kopii zapasowych, tworzy pełną kopię repozytorium, w tym konfigurację i skrypty przechwytujące. Możesz wtedy przenieść repozytorium skopiowane na gorąco na inny serwer.

bahrep
źródło
4

Możesz też użyć svnadmin hotcopypolecenia:

svnadmin hotcopy OLD_REPOS_PATH NEW_REPOS_PATH

Pobiera pełną kopię zapasową z repozytorium, w tym wszystkie hooki, pliki konfiguracyjne itp.

Więcej w SVN Book

pirho
źródło
1
w rzeczywistości jest to hotcopy svnADMIN. Co oznacza, że ​​to również będzie wymagało dostępu do systemu plików repozytorium!
pilif
3

Zakładając, że masz niezbędne uprawnienia do uruchomienia svnadmin, musisz użyć poleceń dump i load .

Dan Dyer
źródło
3

Znalazłem artykuł o tym, jak przenieść repozytoria svn z usługi hostingowej do innej i jak tworzyć lokalne kopie zapasowe:

  1. Zdefiniuj, gdzie będziesz przechowywać swoje repozytoria:

    mkdir ~/repo
    MYREPO=/home/me/someplace ## you should use full path here
    
  2. Teraz utwórz puste repozytorium svn z svnadmin create $MYREPO
  3. Utwórz plik przechwytujący i uczyń go wykonywalnym:

    echo '#!/bin/sh' > $MYREPO/hooks/pre-revprop-change
    chmod +x $MYREPO/hooks/pre-revprop-change
    
  4. Teraz możemy rozpocząć import repozytorium za pomocą svnsync, który zainicjuje repozytorium docelowe do synchronizacji z innego repozytorium:

    svnsync init file://$MYREPO http://your.svn.repo.here/
    
  5. I ostatni szlif, aby przenieść wszystkie oczekujące poprawki do miejsca docelowego ze źródła, z którym został zainicjowany:

    svnsync sync file://$MYREPO
    

Masz teraz lokalne repozytorium svn w ~/repokatalogu.

Źródło:

Braiam
źródło