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


Mam folder "docs" w repozytorium Subversion o nazwie "projekt". Doszedłem do wniosku, że powinien on być przechowywany w osobnym repozytorium Subversion o nazwie "project_docs".

Chciałbym przenieść folder "docs" (i wszystkie jego poprawki) do repozytorium "project_docs". Czy jest jakiś sposób na zrobienie tego?


154
2018-01-06 19:05


pochodzenie




Odpowiedzi:


Jeśli masz dostęp do repozytorium (a nie do kopii roboczej), powinieneś być w stanie zrzucić bieżące repozytorium, przefiltrować je tylko w celu uwzględnienia informacji o folderze docs i załadować go 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żna zachować historii wersji i trzeba będzie zadowalać się kopiowaniem plików do nowego repozytorium i zatwierdzaniem.


179
2018-01-06 19:14



Dobry przykład. Zwróć uwagę, że zgodnie z dokumentacją, do której się złączyłem, to rozwiązanie spowoduje ponowne numerowanie wszystkich wersji, tak aby nie było żadnych "opróżnień". Coś, o czym należy pamiętać, jeśli odwołasz się do wersji dokumentu gdziekolwiek indziej. - Adam Bellaire
Zasugerowałem usunięcie pustych wersji, aby uniknąć dodania do repozytorium docelowego wiązki pustych wersji, najprawdopodobniej dezorientując każdego, kto nie wiedział o obciążeniu. Ponieważ --preserve-revprops zachowa komunikaty commit zamiast domyślnego ładowania. - Samuel
Dziękuję za odpowiedź. Jeśli ktoś potrzebuje wiedzieć, jeśli potrzebujesz więcej niż jeden folder, po prostu umieść między nimi spację na liście dołączanej. Dawny. ... zawierają folderOne folderTwo - Robin Robinson
Przenumerowanie wersji jest prawdopodobnie złym pomysłem, ponieważ komunikaty zatwierdzenia i narzędzia do śledzenia problemów mogą się do nich odnosić - Wim Coenen
To działało dla mnie. Jestem użytkownikiem systemu Windows (Visual SVN Server) i moje pierwsze polecenie wyglądało tak, jeśli pomaga komukolwiek: "C:\Program Files (x86)\VisualSVN Server\bin\svnadmin" dump c:\Repositories\MyRepository > c:\Temp\MyReository.dump - Chris


svndumpfilter ma poważną wadę - jeśli plik lub ścieżka została skopiowana ze ścieżki, do której filtrujesz, do której filtrujesz, svndumpfilter nie będzie mógł wypełnić historii, a zadanie nie powiedzie się.

Możesz użyć svndumpfilter2 jeśli wystąpi ten problem.


28
2018-04-02 09:00



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 konkretną, jak to możliwe ..., a następnie usunąć te wpisy z projektu po imporcie. - James Gawron


Jest to omówione w dokumentacji SVN. Sprawdź Konserwacja repozytorium sekcja na svndumpfilter... W szczególności opisuje sposób zrzutu projektów z centralnego repozytorium i przeniesienia ich do nowych, oddzielnych repozytoriów.


5
2018-01-06 19:10





Nie wierzę, że możesz zrobić to zdalnie (tj. Bez lokalnej kopii). Ale to powinno działać: svn export folder z oryginalnego serwera svn add do twojego nowego repo.

Lubić:

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

Edycja: D'oh, to odrzuca historię. Posługiwać się svnadmin tak jak Samuel opisuje.


2
2018-01-06 19:09



to nie zachowuje wszystkich poprawek, które musi zachować ... - petr k.
Jednak nie można zachować wersji bez dostępu do samego repozytorium. Jeśli możesz mieć tylko kopię roboczą, to jest to najlepsze, co może zrobić. - Samuel


Dla przyszłego odniesienia:

Dokumentacja SVN wyraźnie zgłasza:

Jeśli planujesz ręczną edycję pliku zrzutu, aby usunąć katalog najwyższego poziomu, upewnij się, że twój edytor nie jest ustawiony na automatyczne konwertowanie znaków końca wiersza na format natywny (np. \ R \ n na \ n), ponieważ treść nie będzie wtedy zgodna z metadanymi. Spowoduje to uczynienie pliku zrzutu bezużytecznym.

Użyj sed lub Vim, aby zastąpić katalog najwyższego poziomu, ale nazwa tego 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ą sed tylko nazwy ścieżki.

Zastąp "Ścieżka węzła: stara_ścieżka" za pomocą "Ścieżka węzła: nowa_ścieżka". Więcej informacji można znaleźć w rozdziale 5 książki SVN "Administracja repozytorium".


2
2017-10-05 09:18





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 zastąpić swój adres URL repozytorium (URL_to_docs), lokalizacja na serwerze (/svn/old_repo) i ścieżkę do dokumentów w repozytorium (path/to/docs)

Możesz łatwo edytować swoje docs_only.dumpjeśli chcesz zmienić lokalizację katalogu doc ​​w swoim nowym repozytorium.


1
2017-11-12 13:16