Come posso spostare una singola cartella da un repository Subversion a un altro repository?


156

Ho una cartella "documenti" in un repository Subversion chiamato "progetto". Sono giunto alla conclusione che dovrebbe davvero essere conservato in un repository Subversion separato chiamato "project_docs".

Vorrei spostare la cartella "docs" ( e tutte le sue revisioni ) nel repository "project_docs". C'è un modo per fare questo?

Risposte:


183

Se hai accesso al repository stesso (non una copia funzionante), dovresti essere in grado di scaricare il repository corrente, filtrarlo per includere solo informazioni sulla cartella documenti e caricarlo nell'altro repository.

Sarebbe qualcosa del genere:

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

Senza accesso al repository, non è possibile mantenere la cronologia delle revisioni e si deve accontentarsi di copiare i file nel nuovo repository e di eseguire il commit.


1
Bell'esempio Si noti che, come indicato nella documentazione a cui mi sono collegato, questa soluzione re-numererà tutte le revisioni in modo che non vi siano "vuoti". Qualcosa da tenere a mente se si fa riferimento alle revisioni dei documenti altrove.
Adam Bellaire,

1
Ho suggerito la rimozione di revisioni vuote per evitare di aggiungere un mucchio di revisioni vuote al repository di destinazione, confondendo molto probabilmente chiunque non fosse a conoscenza del carico. Poiché --preserve-revprops manterrà i messaggi di commit anziché utilizzare quello predefinito di caricamento.
Samuel,

11
Grazie per la risposta. Nel caso in cui qualcuno abbia bisogno di sapere, se hai bisogno di più di una cartella, inserisci uno spazio tra loro nell'elenco di inclusione. Ex. ... include folderOne folderTwo
Robin Robinson

6
Rinumerare le revisioni è probabilmente una cattiva idea, in quanto i messaggi di commit e gli strumenti di tracciamento dei problemi potrebbero riferirsi a loro
Wim Coenen,

5
Questo ha funzionato per me. Sono un utente di Windows (Visual SVN Server) e il mio primo comando è simile a questo, se aiuta qualcuno:"C:\Program Files (x86)\VisualSVN Server\bin\svnadmin" dump c:\Repositories\MyRepository > c:\Temp\MyReository.dump
Chris

30

svndumpfilter ha un grave difetto: se un file o un percorso è stato copiato da un percorso che stai filtrando in uno che stai filtrando, svndumpfilter non sarà in grado di compilare la cronologia e il lavoro fallirà.

È possibile utilizzare svndumpfilter2 se si verifica questo problema.


4
Ecco un link migliore per svndumpfilter2: svn.tartarus.org/sgt/svn-tools/svndumpfilter2
bmaupin

In tal caso puoi aggiungere il percorso richiesto all'elenco ... essendo il più specifico possibile ... e quindi rimuovere quelle voci dal progetto dopo l'importazione.
James Gawron,

6

Questo è discusso nella documentazione SVN. Consulta la sezione Manutenzione repository su svndumpfilter... Descrive in modo specifico come scaricare i progetti da un repository centrale e spostarli in nuovi repository separati.


2

Non credo che tu possa farlo da remoto (cioè senza una copia locale). Ma questo dovrebbe funzionare: svn exportla cartella dal server originale, quindi svn addnel nuovo repository.

Piace:

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

Modifica: D'oh, questo lascia cadere la storia. Usa svnadmincome descrive Samuele .


3
Tuttavia, non è possibile conservare le revisioni senza accedere al repository stesso. Se puoi avere solo una copia funzionante, questo è il meglio che può fare.
Samuel,

2

Per riferimento futuro:

La documentazione SVN riporta chiaramente:

Se prevedi di modificare manualmente il file di dump per rimuovere una directory di livello superiore, assicurati che l'editor non sia impostato per convertire automaticamente i caratteri di fine riga nel formato nativo (ad esempio, \ r \ n in \ n), poiché il contenuto non sarà quindi d'accordo con i metadati. Ciò renderà inutile il file di dump.

Usa sed o Vim per sostituire la directory di livello superiore, ma questo nome di directory era contenuto anche all'interno di un file di progetto !!!! Ciò causa un errore di checksum del caricamento SVN.

Pertanto, quando si esegue questa operazione, non eseguire sostituzioni di stringhe con sed solo del nome del percorso.

Sostituire "Node-path: old_path" con "Node-path: new_path". Vedere il capitolo 5 "Amministrazione del repository" del libro SVN per maggiori dettagli.


1

Ho provato a usare la risposta accettata, ma avevo un enorme repository e volevo esportare una piccola directory e non potevo permettermi di scaricare l'intero repository.

Quindi, ho esportato solo le revisioni in cui è cambiata la mia directory (questo potrebbe non funzionare se la directory che si desidera esportare ha riferimenti ad altre posizioni nel repository).

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

È necessario sostituire l'URL del repository ( URL_to_docs), la posizione nel server ( /svn/old_repo) e il percorso dei documenti nel repository ( path/to/docs)

Puoi facilmente modificare il tuo docs_only.dumpse vuoi cambiare la posizione della tua directory doc nel tuo nuovo repository.

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.