Jak przenieść pojedynczy folder z jednego repozytorium Subversion do innego repozytorium?

156

Mam folder „docs” w repozytorium Subversion o nazwie „projekt”. Doszedłem do wniosku, że naprawdę powinno być przechowywane w oddzielnym repozytorium Subversion o nazwie „project_docs”.

Chciałbym przenieść folder „docs” ( i wszystkie jego wersje ) do repozytorium „project_docs”. Czy jest na to sposób?

lewy koniec
źródło

Odpowiedzi:

183

Jeśli masz dostęp do samego repozytorium (nie kopii roboczej), powinieneś być w stanie zrzucić bieżące repozytorium, przefiltrować je tak, aby zawierało tylko informacje o folderze docs, i załadować je do innego repozytorium.

Byłoby coś takiego:

svnadmin dump /svn/old_repos > ./repository.dump
svndumpfilter include path/to/docs --drop-empty-revs --renumber-revs --preserve-revprops < ./repository.dump > ./docs_only.dump
svnadmin load /svn/new_repos < ./docs_only.dump

Bez dostępu do repozytorium nie możesz utrzymywać historii zmian i musisz zadowolić się skopiowaniem plików do nowego repozytorium i zatwierdzeniem.

Samuel
źródło
1
Niezły przykład. Zauważ, że zgodnie z dokumentacją, do której utworzyłem łącze, to rozwiązanie spowoduje ponumerowanie wszystkich wersji, tak aby nie było żadnych „pustych miejsc”. Coś, o czym należy pamiętać, odwołując się do wersji dokumentu w innym miejscu.
Adam Bellaire,
1
Zasugerowałem usunięcie pustych wersji, aby uniknąć dodawania kilku pustych wersji do repozytorium docelowego, najprawdopodobniej myląc każdego, kto nie wiedział o załadowaniu. Ponieważ --preserve-revprops zachowa komunikaty o zatwierdzeniach zamiast używać domyślnego komunikatu ładowania.
Samuel,
11
Dziękuję za odpowiedź. W przypadku, gdyby ktoś chciał wiedzieć, jeśli potrzebujesz więcej niż jednego folderu, po prostu umieść między nimi spację na liście włączeń. Dawny. ... include folderJeden folderDwa
Robin Robinson
6
Zmiana numeracji wersji jest prawdopodobnie złym pomysłem, ponieważ komunikaty o zmianach i narzędzia do śledzenia problemów mogą się do nich odnosić
Wim Coenen,
5
To zadziałało dla mnie. Jestem użytkownikiem systemu Windows (Visual SVN Server) i moje pierwsze polecenie wyglądało tak, jeśli to komuś pomoże:"C:\Program Files (x86)\VisualSVN Server\bin\svnadmin" dump c:\Repositories\MyRepository > c:\Temp\MyReository.dump
Chris
30

svndumpfilter ma poważną wadę - jeśli plik lub ścieżka został skopiowany ze ścieżki, którą filtrujesz, do tej, którą filtrujesz, svndumpfilter nie będzie w stanie wypełnić historii i zadanie zakończy się niepowodzeniem.

Jeśli napotkasz ten problem, możesz użyć svndumpfilter2 .

compie
źródło
4
Oto lepszy link do svndumpfilter2: svn.tartarus.org/sgt/svn-tools/svndumpfilter2
bmaupin
W takim przypadku możesz dodać wymaganą ścieżkę do listy ... będąc tak szczegółową, jak to tylko możliwe ... a następnie usunąć te wpisy z projektu po zaimportowaniu.
James Gawron
6

Jest to omówione w dokumentacji SVN. Zapoznaj się z sekcją Konserwacja repozytorium na svndumpfilter… W szczególności opisuje, jak zrzucać projekty z centralnego repozytorium i przenosić je do nowych, oddzielnych repozytoriów.

Adam Bellaire
źródło
2

Nie wierzę, że możesz to zrobić zdalnie (tj. Bez lokalnej kopii). Ale to powinno działać: w svn exporttakim razie folder z oryginalnego serwerasvn add do nowego repozytorium.

Lubić:

$ svn checkout svn://example.net/newrepo .
$ svn export svn://example.com/oldrepo/mydir ./mydir
$ svn add ./mydir; svn commit

Edycja: D'oh, to upuszcza historię. Użyj, svnadminjak opisuje Samuel .

Peter Stone
źródło
3
Jednak nie można zachować wersji bez dostępu do samego repozytorium. Jeśli możesz mieć tylko kopię roboczą, to najlepsze, co może zrobić.
Samuel,
2

Dla przyszłego odniesienia:

Dokumentacja SVN jasno informuje:

Jeśli planujesz ręcznie edytować plik zrzutu, aby usunąć katalog najwyższego poziomu, upewnij się, że Twój edytor nie jest ustawiony na automatyczną konwersję znaków końca wiersza do formatu natywnego (np. \ R \ n do \ n), ponieważ treść nie będzie wtedy zgodna z metadanymi. Spowoduje to, że plik zrzutu będzie bezużyteczny.

Użyj seda lub Vima do podstawienia katalogu najwyższego poziomu, ale ta nazwa katalogu była również zawarta w pliku projektu !!!! Powoduje to błąd sumy kontrolnej obciążenia SVN.

Więc kiedy wykonujesz tę operację, nie zastępuj ciągów za pomocą seda tylko z nazwy ścieżki.

Zastąp „Ścieżka-węzła: stara_ścieżka” tekstem „Ścieżka-węzła: nowa_ścieżka”. Więcej informacji można znaleźć w książce SVN, rozdział 5, „Administracja repozytorium”.

nios
źródło
1

Próbowałem użyć zaakceptowanej odpowiedzi, ale miałem ogromne repozytorium i chciałem wyeksportować mały katalog i nie mogłem sobie pozwolić na zrzucenie całego repozytorium.

Tak więc wyeksportowałem tylko wersje, w których zmienił się mój katalog (może to nie działać, jeśli katalog, który chcesz wyeksportować, zawiera odniesienia do innych miejsc w repozytorium).

svn log URL_to_docs | awk '/^r/{gsub(/^r/,"",$1);print $1}' > revisions.txt
#tac for revisions in reverse (oldest revision first)
tac revisions.txt | while read line; do svnadmin dump /svn/old_repo -r$line >> ./docs_revisions.dump ; done

#You don't have to filter if you commited only files in your directory docs in your exported revisions
svndumpfilter include path/to/docs --drop-empty-revs --renumber-revs --preserve-revprops < ./docs_revisions.dump > ./docs_only.dump

svnadmin load /svn/new_repos < ./docs_only.dump

Musisz zamienić adres URL repozytorium ( URL_to_docs), lokalizację na serwerze ( /svn/old_repo) i ścieżkę do dokumentów w repozytorium ( path/to/docs)

Możesz łatwo edytować swój, docs_only.dumpjeśli chcesz zmienić lokalizację katalogu dokumentów w nowym repozytorium.

Renato
źródło