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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top