Come clonare una parte del repository SVN?
-
02-10-2019 - |
Domanda
Ho un repository SVN, che ha molte directory all'interno. Ora vorrei clonare questo repository, lasciando solo una particolare directory in esso. E, naturalmente, non ho bisogno di alcuna revisione relativi ad altre directory in questo nuovo repository. Come posso farlo? Grazie.
Soluzione
Sarà necessario creare un dump del repository, e filtrare le directory e le revisioni che si desidera. svndumpfilter
è lo strumento per tutti gli usi per questo. Vedere questo capitolo del libro eversione per un esempio.
Altri suggerimenti
Un'altra possibilità è git clone svn, che tira solo la directory di interesse. Si può quindi essere spinto ad un nuovo repo svn. È facile? No, ma se non si ha accesso al server, è a portata di mano. Sono sicuro che c'è un modo migliore -. Ma in questo modo si assicura che non accidentalmente spingere al repository svn originale
# original svn path git svn clone http://server/path/to/clone orig # SVN to put just your branch in svnadmin create new # add one entry, or git svn errors out... svn co file:///path/to/new new.wd mkdir new.wd/null svn add new.wd/null svn ci -m"add null" new.wd/null # clone our clone git clone file:///path/to/orig abc cd abc # set up svn path to the svn repo git svn init file:///path/to/new # pull data in (our one commit) git svn fetch # show the branches git branch -a # Prep the git repot for the push git rebase --onto remotes/git-svn --root master # finally push to the new svn repo. git svn dcommit
No dove avrei potuto trovare il modo di fare questo, così mi si avvicinò con questo. Potrebbe essere necessario pasticciare con la svn donf file in questo modo:
svn_repo="$(pwd)/new" user="myusername" echo '[/]' >> $svn_repo/conf/authz echo "$user = rw" >> $svn_repo/conf/authz echo '[users]' >> $svn_repo/conf/passwd echo "$user = test" >> $svn_repo/conf/passwd echo 'password-db = passwd' >> $svn_repo/conf/svnserve.conf echo "svn repo is file://$svn_repo" svn co file://$svn_repo svn.wd
Nell'esempio precedente, myusername avrebbe una password di prova.
Il modo tradizionale di fare ciò che si sta cercando di fare è quello di scaricare il repository in un file di dump, uso svndumpfilter per includere o escludere i file in base alle proprie esigenze e poi per caricare il file di dettagli filtrati in un nuovo repository. Questo approccio funziona bene per semplici modifiche, come la rimozione di un paio di file da un repository.
Le cose diventano un po 'più difficile quando il repository di file include mosse e le copie.
Consente di prendere l'esempio più semplice di avere un progetto cartella chiamata MyProject
che è stato rinominato in qualche tempo nella storia a TheProject
. Un altro file chiamato TheProject/copiedfile.txt
è stato successivamente copiato sotto TheProject
dalla posizione AnotherLocation
. Una struttura ad albero rudimentale potrebbe essere la seguente.
...
+ AnotherLocation
|--- copiedfile.txt
|--- unwantedfile.txt
+ TheProject
|--- copiedfile.txt
|--- otherfile.txt
...
Si vorrebbe TheProject
di avere un proprio nuovo repository. Quindi uscire il vostro repository per uno svndumpfilter di file e l'uso per includere solo TheProject
poiché questo è il nome del progetto che si vede nella revisione HEAD.
svndumpfilter include /TheProject < input.dump > output.dump
È purtroppo ottiene questo errore da svndumpfilter
svndumpfilter: E200003: Invalid copy source path '/MyProject'
Ecco perché TheProject
usato per essere chiamato MyProject
e ad un certo revisione, in passato è stato rinominato. Dal momento che una ridenominazione è essenzialmente un cancellare e copiare, svndumpfilter non riesce a trovare la fonte della copia che crea TheProject
e si presenta a ragione esce con un errore. Così ci prova ancora con il seguente comando che include MyProject
così
svndumpfilter include /TheProject /MyProject < input.dump > output.dump
Svndumfilter ora esce con un altro errore.
svndumpfilter: E200003: Invalid copy source path '/AnotherLocation/copiedfile.txt'
Sì, questo è perché copiedfile.txt
è stato copiato da AnotherLocation
a TheProject
. Quindi dobbiamo includere questo file così perché altrimenti non potremmo copiarlo `TheProject'. Proviamo di nuovo.
svndumpfilter include /TheProject /MyProject /AnotherLocation/copiedfile.txt < input.dump > output.dump
L'operazione riesce! La terza volta fortunato a quanto pare!
Consente di tentare di caricare il nostro file di dump filtrato al repository.
svnadmin create newrepo
svnadmin load newrepo < output.dump
Non così fortunato dopotutto! Il seguente errore viene in su durante il caricamento
* editing path : AnotherLocation/copiedfile.txt ...svnadmin: E160013: File not found: transaction '1-1', path '/AnotherLocation/copiedfile.txt'
Ah! questo è perché abbiamo dimenticato di includere AnotherLocation
che è richiesta in quanto è la cartella principale di copiedfile.txt
svndumpfilter include /TheProject /MyProject /AnotherLocation < input.dump > output.dump
Ok questo comando funziona e il caricamento funziona anche. Purtroppo abbiamo ora incluso /AnotherLocation/unwantedfile.txt
pure. Si conclude che l'uso di svndumpfilter include
realtà non funziona in quanto non ci dà la granularità siamo dopo. Dobbiamo fare tutto ciò utilizzando svndumpfilter exclude
nel tentativo di escludere tutto ciò che non è necessario quindi finire con un repository con i file di cui abbiamo bisogno. Basti dire che è pieno di una propria serie di problemi. Per esempio è abbastanza facile per escludere i file che sono effettivamente necessari nel repository. Se la gente vuole un esempio di questo posso estendere questa risposta.
Ci deve essere un modo migliore. Si scopre che c'è, ma si tratta di un'offerta commerciale. Abbiamo sviluppato uno strumento chiamato Suddivisione specializzata in estrazione di file e cartelle da un repository Subversion. Si può anche eliminare i file (o obliterate) da un repository subversion così come dividere un archivio in due parti, garantendo che nessun file sono mancati fuori da una delle due repository. Ciò che rende brillare suddivisione è il fatto che essa detiene una visione in memoria di tutta la repository e gestisce gli algoritmi necessari per risolvere tutti i problemi che abbiamo riscontrato nell'esempio di cui sopra. Questo significa che si ottiene il livello di dettaglio necessario per estrarre i file corretti solo risparmiando all'utente il tempo dal momento che il completamento del funzionamento in un unico passaggio.