Come cambiare UUID copia di lavoro sovversione?


13

Recentemente ho aggiornato i repository Subversion da una vecchia versione 1.2.3 alla 1.6.0 tramite dump / caricamento svnadmin . I vecchi repository utilizzavano tutti lo stesso UUID (i repository sono stati creati utilizzando la copia di un repository di modelli). Ho modificato l'UUID su un paio di nuovi repository tramite svnadmin setuuid per renderlo unico. Non posso semplicemente spostare le mie copie di lavoro esistenti di quei repository perché gli UUID sono diversi. Conosco l'esportazione della copia di lavoro e il check-out dal nuovo repository, ma mi chiedevo se ci fosse un modo per cambiare l'UUID della copia di lavoro sul posto, come quello che svnadmin setuuid fa per i repository.

Risposte:


3

È necessario modificare tutti i file "voci" nel repository pull. Se il repository ha molte directory, find + uno script sed renderà breve il compito.


17

Nuova risposta dal formato di copia funzionante di Subversion 1.7 . È necessaria l' sqlite3utilità della riga di comando.

Nella directory principale della copia di lavoro, ora è presente una singola .svn/cartella con un database SQLite. È possibile eseguire una query sul repository corrente UUIDnoto per la propria copia di lavoro con:

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

Di conseguenza, la modifica UUIDpuò essere effettuata con:

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

Naturalmente, mantenere un backup del .svn/wc.dbfile prima di richiamare la query di aggiornamento. Non c'è quasi alcuna possibilità che l'entità repository abbia un ID diverso o che ci siano più righe in quella tabella ma è possibile verificare se si ottengono risultati imprevisti.


+1 ha funzionato perfettamente con un repository trasferito che ha anche cambiato l'UUID
Amro

8

Ecco un comando che fa il trucco per SVN 1.6 e precedenti:

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

Sostituisci old-uuide new-uuidcon gli ID effettivi.


1
+ 1 Grazie per la soluzione. Questo non funziona per le directory con spazi. "find. -type f -name entry -exec sed -i 's / old-uuid / new-uuid / g' {} \;" senza virgolette doppie sembra funzionare.
Tommy,

sry per necroing questo thread questo metodo mi ha fatto risparmiare un sacco di tempo .. per gli altri che lo provano, voglio solo aggiungere una nota. Sed su MACOX sembra aver bisogno di un uso leggermente diverso, devi dire sed -i "" 's/old-uuid/new-uuid/' e funziona (solo le doppie virgolette vuote extra) ( ref )
Karthik T

2

La risposta di Yves Martin ha funzionato perfettamente per noi su una serie di copie funzionanti con SVN 1.8, ma alla fine ci siamo imbattuti in casi in cui non ha funzionato.

Eseguire il comando di Yves senza "dove id = 1" ha funzionato in tutti i casi per noi:

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

Indagando sul perché ciò sia accaduto, ho scoperto che più UUID vengono archiviati durante il trasferimento del repository, contrariamente all'intuizione di Yves secondo cui ciò non dovrebbe mai accadere.

Una nuova voce nella tabella REPOSITORY viene aggiunta dopo un trasferimento anziché aggiornare quella esistente, memorizzando un ID incrementato con la nuova radice del repository e il suo UUID. Quindi i casi che non funzionavano correttamente erano le copie funzionanti che erano già state ricollocate in passato: il comando sembrava funzionare, ma era cambiato solo l'UUID iniziale, non quello attualmente in uso.

È possibile controllare l'elenco di root e UUID memorizzati in una copia funzionante con questo comando:

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

Noterò infine che ho dovuto usare un diverso set di virgolette per la riga di comando / file batch di Windows, come segue:

> sqlite3.exe .svn\wc.db "update REPOSITORY set uuid='1c0d1ec1-2326-0410-bef5-eb29cddfc032'"

Grazie per i dettagli quando una copia di lavoro è stata trasferita, non ero a conoscenza di questo comportamento
Yves Martin,

1

La sezione " Gestione degli UUID del repository " nel libro svn red bean potrebbe avere la risposta che stai cercando.


Questa sezione parla degli UUID del repository, non degli UUID di copia funzionanti.
Ioan,

@Ioan: Citando da quella sezione: Per le persone che usano versioni di Subversion precedenti alla 1.5, queste attività sono un po 'più complicate. È possibile impostare esplicitamente l'UUID di un repository eseguendo il piping di uno stub di file di dump del repository che trasporta la nuova specifica UUID tramite il caricamento svnadmin --force-uuid REPOS-PATH - Non è questo ciò di cui hai bisogno?
Yasouser,

1
Ancora una volta, no, non sto parlando di UUID di repository , ma piuttosto di UUID di copia funzionanti ; le copie funzionanti sono le stesse di una cassa.
Ioan,

Non è possibile modificare l'UUID della copia di lavoro con quello del repository del server senza aggiornare o svn passare la copia di lavoro nella posizione [nuova / esistente] del repository.
Yasouser,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.