Domanda

Siamo in procinto di spostare i nostri repository SVN da una macchina all'altra e con essa verrà un nuovo nome di dominio per il nuovo repository. Il problema è che all'interno del repository ci sono molti riferimenti svn: externals ad altri progetti all'interno del repository. Ad esempio, abbiamo projectA, che ha le proprietà svn: externals:

external/libraryA svn://oldserver.net/repo/libraryA
external/libraryB svn://oldserver.net/repo/libraryB

... e così via. Tutti gli URL fanno riferimento a questo particolare nome di dominio, quindi può essere facilmente analizzato. Avendo già appreso la mia lezione, eseguirò la migrazione di questi URL per essere " svn: // localhost / " ;, ma devo trovare un modo per passare attraverso la cronologia del repository e riscrivere tutti i vecchi URL, in modo che possiamo ancora controlla le revisioni precedenti di questi progetti senza collegamenti interrotti.

Come potrei fare per fare questo?

È stato utile?

Soluzione

Come hai indicato che vuoi comunque essere in grado di verificare le revisioni precedenti, l'unica soluzione è davvero di "riscrivere". l'intera storia (soluzione D menzionata in precedenza).

Per fare ciò, dovresti:

1) Scarica il contenuto del repository intero usando svnadmin dump :

$ svnadmin dump /path/to/repos > original-dumpfile
* Dumped revision 0.
* Dumped revision 1.
* Dumped revision 2.
* Dumped revision 3.

2) Modifica il file di dump, per cambiare gli URL svn: externals. Questa è la parte più difficile : supponendo che il repository contenga anche dati binari, l'apertura del file di dump in un semplice editor di testo probabilmente corromperà il file di dump. Ho avuto buone esperienze usando un cosiddetto "editor esadecimale", ad esempio Freeware Hex Editor XVI32

3) Crea un nuovo repository e carica il file di dump modificato in esso:

$ svnadmin create newrepos
$ svnadmin load newrepos < modified-dumpfile

Per ulteriori informazioni, potresti essere interessato a questo link:
http://svnbook.red-bean.com/en/1.1/ch05s03.html

NOTA: Subversion 1.5 ha effettivamente aggiunto il supporto per URL relativi nella proprietà svn: externals, che può prevenire con precisione questo tipo di problemi in futuro:
http://subversion.tigris.org/svn_1.5_releasenotes.html#externals

Altri suggerimenti

Userei SvnDumpTool per questo. Ha esattamente quello che stai cercando:

svndumptool transform-prop svn:externals "(\S*) (|-r ?\d* ?)http://oldserver.net(/\S*)" "\2\3 \1" source.dumpfile source-fixed-externals.dumpfile

Questo aggiusta ogni esterno al subversion 1.5 format e utilizza URL relativi.

Quindi svn: esterni come:

external/libraryA svn://oldserver.net/repo/libraryA

diventa:

 /repo/libraryA external/libraryA

utilizzando gli URL relativi alla radice del server.

Ho dovuto trasferire 12 copie funzionanti su 9 utenti e 4 distribuzioni. È stata una semplice modifica, sostituendo un dominio con un IP, ovvero thing.domain.net - > 192.168.0.1

Aspettando che svn relocate si comporti come descritto (attraversa esterni nidificati) Ho scritto una semplice istruzione DOS da eseguire in ogni posizione:

per / D% G in (*) do ( cd ./%G & Amp; svn riposizionare http://thing.domain.net http://192.168.0.1 & Amp; cd ..)

Non ha funzionato come previsto, trasferendo solo il WC principale.

La mia soluzione era quella di modificare i repository stessi (ho usato Tortoise Repo Browser) per cambiare la posizione degli esterni. In seguito a questa modifica è stato sufficiente un aggiornamento per il genitore trasferito per rendere tutto in linea.

Sarebbe probabilmente una buona idea convincere tutti gli utenti di Tortoise a cancellare la loro cronologia degli URL in modo che non eseguano inavvertitamente operazioni utilizzando il vecchio URL (esiste ancora nella ricerca DNS):

Impostazioni- > Dati salvati- > Cronologia URL- > Cancella

Ho modificato il mio file di dump con vi ma ho dovuto usare il " -b " passa alla modifica in modalità binaria in modo tale che i caratteri che potrebbero essere interpretati come terminazioni di riga non vengano convertiti.

es. vi -b nomefile.dump

Inoltre, ho scoperto che, se la lunghezza dell'URL cambia, è necessario modificare anche le lunghezze delle stringhe. Ad esempio, considera una voce simile a questa:

Percorso nodo: trunk / src / include

Tipo di nodo: dir

Node-action: change

Lunghezza contenuto prop: 192

Lunghezza contenuto: 192

K13

svn: gli esterni

V 156

MGL_ABC svn: // nome_server / dir1 / dir2

MGL_DEF svn: // nome_server / dir1 / dir3

Quando modifichi questi URL, se cambia la lunghezza della stringa, devi anche cambiare il "192", "192". e "156" per abbinare la nuova lunghezza. Ho trovato difficile calcolare la lunghezza assoluta ma è facile trovare il differenziale.
Ad esempio, supponiamo che l'URL 1 sia più corto di 3 caratteri e l'URL 2 sia più corto di 4 caratteri. Quindi, dovresti sottrarre '7' da ciascuno di quei tre numeri di lunghezza della stringa.

Potresti:

a) controlla la vecchia revisione e cambia il file hosts per puntare il vecchio nome al nuovo indirizzo, quindi svn update. Nel caso in cui anche il percorso dell'URL sia cambiato ... beh, potresti anche:

b) prenditi il ??tempo per scrivere uno script che trovi le proprietà nella copia di lavoro corrente (vecchia revisione) e cambi lì gli URL, senza impegnarli. OR:

c) prendi nota della revisione (-s) in cui hai controllato i nuovi valori delle proprietà, controlla la vecchia versione e fai semplicemente unire quelle revisioni (-che riguardano solo le proprietà) nella tua copia di lavoro.

d) o, eventualmente, utilizzare svndump per scaricare i dati del repository, sostituire stringa l'URL nel dump, quindi ripristinarlo .. Non ti darei alcuna garanzia che funzioni anche ;-)

Tutti i miei esterni erano in directory denominate flow . Ho corretto gli URL nei miei esterni con questo one-liner (bash shell):

for p in $(find -maxdepth 4 -name flow); do svn ps svn:externals "$(svn pg svn:externals $p/.. | perl -pe 's/^(\w+) svn\+ssh.*thing\.domain\.net(.*)/$2 $1/')" $p/..; done
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top