Jak zmienić UUID kopii roboczej Subversion?

13

Niedawno zaktualizowałem repozytoria Subversion ze starej wersji 1.2.3 do 1.6.0 za pomocą zrzutu / ładowania svnadmin . Wszystkie stare repozytoria używały tego samego UUID (repozytoria zostały utworzone za pomocą kopiowania repozytorium szablonów). Zmieniłem UUID w kilku nowych repozytoriach za pomocą svnadmin setuuid, aby były unikalne. Nie mogę po prostu przenieść moich istniejących kopii roboczych tych repozytoriów, ponieważ UUID są różne. Wiem o eksportowaniu kopii roboczej i wyewidencjonowaniu z nowego repozytorium, ale zastanawiałem się, czy istnieje sposób, aby po prostu zmienić UUID kopii roboczej w miejscu, tak jak robi to svnadmin setuuid dla repozytoriów.

Ioan
źródło

Odpowiedzi:

3

Musisz edytować wszystkie pliki „wpisów” w wyciągniętym repozytorium. Jeśli repozytorium zawiera wiele katalogów, skrypt + + sed sprawi, że zadanie będzie krótsze.

Jan
źródło
17

Nowa odpowiedź od formatu kopii roboczej Subversion 1.7 . Potrzebujesz sqlite3narzędzia wiersza polecenia.

W katalogu głównym kopii roboczej znajduje się teraz pojedynczy .svn/folder z bazą danych SQLite. Możesz wyszukać bieżące repozytorium UUIDznane z kopii roboczej za pomocą:

$ sqlite3 .svn/wc.db 'select uuid from REPOSITORY where id=1'
b6dc3e6c-5320-4549-b231-c153d86d7525

W rezultacie zmiany UUIDmożna dokonać za pomocą:

$ sqlite3 .svn/wc.db 'update REPOSITORY set uuid="1c0d1ec1-2326-0410-bef5-eb29cddfc032" where id=1'

Oczywiście zachowaj kopię zapasową .svn/wc.dbpliku przed wywołaniem zapytania o aktualizację. Nie ma prawie żadnej szansy, że twoja jednostka repozytorium ma inny identyfikator lub w tej tabeli jest wiele wierszy, ale możesz sprawdzić, czy otrzymasz nieoczekiwane wyniki.

Yves Martin
źródło
+1 działało idealnie z przeniesionym repozytorium, które również zmieniło UUID
Amro
8

Oto polecenie, które rozwiązuje problem w przypadku SVN 1.6 i niższych:

find . -type f -name entries -exec sed -i 's/old-uuid/new-uuid/g' {} \;

Zastąp old-uuidi new-uuidrzeczywistymi identyfikatorami.

Emil M.
źródło
1
+ 1 Dzięki za rozwiązanie. Nie działa to w przypadku katalogów zawierających spacje. msgstr "znajdź. -type f -name wpisy -exec sed -i 's / old-uuid / new-uuid / g' {} \;" bez podwójnych cytatów wydaje się działać.
Tommy
płacz za nekrowaniem tego wątku ta metoda pozwoliła mi zaoszczędzić sporo czasu .. dla innych próbujących tego, po prostu chcę dodać notatkę. Sed na MACOX wydaje się wymagać nieco innego użycia, musisz powiedzieć sed -i "" 's/old-uuid/new-uuid/' i działa (tylko dodatkowe puste podwójne cudzysłowy) ( ref )
Karthik T
2

Odpowiedź Yvesa Martina działała dla nas świetnie w przypadku wielu kopii roboczych z SVN 1.8, ale ostatecznie natrafiliśmy na przypadki, w których to nie działało.

Uruchomienie polecenia Yves bez „where id = 1” działało we wszystkich przypadkach dla nas:

$ sqlite3 .svn/wc.db 'update REPOSITORY set uuid="1c0d1ec1-2326-0410-bef5-eb29cddfc032"'

Badając, dlaczego tak się stało, dowiedziałem się, że podczas przenoszenia repozytorium przechowywanych jest wiele identyfikatorów UUID, w przeciwieństwie do intuicji Yvesa, że ​​tak się nie powinno stać.

Nowy wpis do tabeli REPOSITORY jest dodawany po przeniesieniu zamiast aktualizowania istniejącego, przechowując przyrostowy identyfikator z nowym katalogiem głównym repozytorium i jego UUID. Tak więc przypadkami, które nie działały poprawnie, były kopie robocze, które zostały już przeniesione w przeszłości: Wydaje się, że polecenie działa, ale zmieniono tylko początkowy identyfikator UUID, a nie ten, który jest obecnie używany.

Za pomocą tego polecenia można sprawdzić listę przechowywanych katalogów głównych i UUID w kopii roboczej:

$ sqlite3 .svn/wc.db 'select id,uuid,root from REPOSITORY'

W końcu zauważę, że musiałem użyć innego zestawu cytatów dla plików wiersza poleceń / plików wsadowych systemu Windows, w następujący sposób:

> sqlite3.exe .svn\wc.db "update REPOSITORY set uuid='1c0d1ec1-2326-0410-bef5-eb29cddfc032'"
Julien Barnoin
źródło
Dzięki za szczegóły, gdy przeniesiono kopię roboczą, nie byłem świadomy tego zachowania
Yves Martin
1

W sekcji „ Zarządzanie UUID repozytorium ” w książce svn red-bean może znaleźć odpowiedź, której szukasz.

yasouser
źródło
W tej sekcji omówiono UUID repozytorium, a nie UUID kopii roboczej.
Ioan
@Ioan: Cytując z tej sekcji: Dla osób używających wersji Subversion wcześniejszych niż 1.5, zadania te są nieco bardziej skomplikowane. Możesz jawnie ustawić UUID repozytorium, przesyłając potokiem plik zrzutu zrzutu repozytorium, który przenosi nową specyfikację UUID poprzez svnadmin load --force-uuid REPOS-PATH - Czy nie jest to potrzebne?
yasouser
1
Ponownie nie, nie mówię o identyfikatorach UUID repozytorium , ale raczej o identyfikatorach UUID kopii roboczych ; kopie robocze są takie same jak w kasie.
Ioan
Nie można zmienić identyfikatora UUID kopii roboczej na identyfikator repozytorium serwera bez aktualizacji lub svn przełączenia kopii roboczej do [nowej / istniejącej] lokalizacji repozytorium.
yasouser