2009-06-10 11 views
65

Uno dei miei compagni di squadra ha chiesto se è possibile esportare da un SVN a un altro, il tutto mantenendo la cronologia.Copia SVN tra repository con cronologia

Per me, sembra che sarebbe una richiesta comune.

Quindi: È possibile eseguire la migrazione tra repository SVN mantenendo tutti la cronologia?

È importante notare che non abbiamo accesso a svnadmin sull'origine, ma è presente sulla destinazione.

Se questo si riduce al solo controllo di ogni revisione dall'origine e al suo controllo alla destinazione, saremmo OK con quello, finché c'era un processo automatizzato per quello.

MODIFICA: Ho dimenticato di dire che il repository di destinazione è su Windows.

+0

si potrebbe chiedere chi ha svnadmin diritti di fare l'esportazione per voi. – Glen

risposta

39

[Edit: La risposta originale che segue è da pre SVN 1.7, e c'è questo era il modo migliore per risolvere il problema (anche se non è il caso di svnsync uso primario). In SVN 1.7 client o poi c'è lo strumento svnrdump che fa più direttamente ciò che si sta cercando di ottenere)]


uso svnsync per sincronizzare sorgente alla destinazione (richiede l'accesso di amministrazione nel repository di destinazione o, almeno, un modo per aggiungere ganci, ma senza accesso speciale al repository di origine). Se la destinazione ha già delle revisioni, sincronizzare la sorgente in un repository temporaneo e quindi utilizzare svn-merge-repos.pl per unire i due repository locali.

+0

Questo sembra abbastanza vicino alle mie esigenze. –

+0

Non è possibile fare un semplice 'svnsync TOURL FROMURL'? –

+0

Le opzioni della riga di comando sono diverse, vedere http://linux.die.net/man/1/svnsync. E devi prima creare un hook (forse vuoto) pre-revprop-change (o pre-revprop-change.bat se sei su Windows). – mihi

8

Il modo per ottenere questo risultato è lo svnadmin dump command. Se non hai accesso a svnadmin, chiederei alla persona che lo fa se può fornirti una discarica. Ciò renderà molto più semplice anche il processo di importazione.

Sei su un archivio condiviso al momento? Questo potrebbe rendere la persona che possiede il repository molto vicino a darti un dump, dato che sarà una copia dell'intero repository, non solo il tuo pezzo di esso.

+0

Sì, questa sarebbe una fonte di repository condivisa. Ed è per questo che non possiamo ottenere una discarica. –

+0

Forse potresti convincere il proprietario a fornirti un dump filtrato, usando svndumpfilter? Vedi http://svnbook.red-bean.com/en/1.5/svn.reposadmin.maint.html#svn.reposadmin.maint.tk.svndumpfilter per maggiori informazioni. – markusk

+0

sembra come svnsync è quasi il modo migliore per andare. –

8

Avevo un bisogno simile (quindi ho visitato questa pagina) e ho finito per scrivere il mio programma per fare il lavoro. Pensato che lo strumento può essere utile per gli altri che sono ancora alla ricerca di una soluzione:

  • Lo strumento non ha bisogno di accesso di amministratore al repository di origine.
  • Supporta aggiungere/eliminare/copiare/spostare, mantiene la proprietà del nodo (ad esempio svn: ignore, svn: external) e la proprietà di revisione (ad esempio, si ottiene l'autore e la data/ora corretti).
  • Può anche copiare in modo incrementale nuove revisioni.
  • Ha sia GUI che un'utilità della riga di comando.

Se qualcuno è interessato, il check-out here

+0

Sembra molto interessante! –

0

Se è necessario solo un repo controllo di versione con il pieno di modifiche, è possibile utilizzare con il plugin bzr bzr-svn. Quando si esegue il checkout di un repository SVN, tutto sarà sincronizzato.

8

È possibile utilizzare git-svn (o forse un altro sistema SCM) per eseguire questa operazione.

sarebbero le fasi:

1. Get a git svn clone of each repository: 
    git svn clone <SVN-REPOSITORY-FROM> source-repo 
    git svn clone <SVN-REPOSITORY-TO> dest-repo 

2. Create patches to be imported: 
    cd source-repo/ 
    export commitFrom=`git log --pretty=%H | tail -1` 
    git format-patch -o /tmp/mergepatchs ${commitFrom}..HEAD . 

3. Import the patches 
    cd dest-repo/ 
    git am /tmp/mergepatchs/*.patch 

fa riferimento: http://blog.neutrino.es/2012/git-copy-a-file-or-directory-from-another-repository-preserving-history/

+2

ha funzionato in modo imperfetto per me. Sono ora l'autore di tutti i cambiamenti - e tutti datano oggi. Si noti che il "dest-repo" dell'esempio precedente è ora un repository GIT e il SVN-REPOSITORY-TO è ancora in SVN. – MarkHu

+0

Funziona alla grande, ma come accennato si finisce con un repository git locale, quindi ho dovuto eseguire "git svn dcommit" nel dest-repo per commetterlo nel repository SVN di destinazione. –

Problemi correlati