2009-02-21 12 views
37

Sono relativamente nuovo a Git, ma ho trovato così facile lavorare a casa che mi piacerebbe utilizzarlo al lavoro dove sono archiviati i nostri progetti nei repository Svn. Sfortunatamente, i repository sono leggermente non standard e ho problemi a farli clonare. Certo, tutti hanno tronco, rami/e tag /, ma rami/e tag/hanno sottodirectory prima di colpire le reali directory progetto:Clonare un repository Svn non standard con Git-Svn

trunk/ 
branches/maintenance/release1 
branches/maintenance/release2 
... 
branches/development/feature1 
branches/development/feature2 
... 
tags/build/build1 
tags/build/build2 
... 
tags/release/release1 
tags/release/release2 

Dopo la clonazione:

$ git svn clone -s --prefix=svn/ https://mydomain.com/svnproject 
$ git branch -r 
    development 
    [email protected] 
    maintenance 
    [email protected] 
    tags/build 
    tags/[email protected] 
    tags/release 
    tags/[email protected] 
    trunk 
    [email protected] 

I Get nessuno delle filiali o dei tag di progetto effettivi. In realtà devo essere in grado di lavorare sul trunk, un ramo di manutenzione e un ramo di sviluppo. Ho provato questo approccio oltre a diversi hack durante la modifica della configurazione, ma nulla funziona per me.

C'è un modo per ottenere i componenti chiave del mio progetto Svn non standard in un repository git locale in modo che possa spostarmi facilmente da una all'altra?

Molte grazie.

AGGIORNAMENTO: Devo aggiungere che non posso fare un passaggio all'ingrosso a Git (ancora). Ci sono altri membri del team coinvolti e una presenza internazionale. La logistica della transizione è più di quanto io sia disposto a intraprendere fino a quando non mi sentirò molto più a mio agio con Git; come ho detto, sono ancora piuttosto nuovo. Ho appena graffiato la superficie delle sue capacità.

risposta

34

Lee B aveva ragione. La risposta, fornita da doener in #git, è di aggiornare Git a 1.6.x (avevo usato 1.5.x). 1.6.x offre profonda clonazione in modo che più caratteri jolly possono essere utilizzati con l'opzione --branches:

$ git svn clone https://svn.myrepos.com/myproject web-self-serve \ 
      --trunk=trunk --branches=branches/*/* --prefix=svn/ 
$ git branch -r 
    svn/development/sandbox1 
    svn/development/feature1 
    svn/development/sandbox2 
    svn/development/sandbox3 
    svn/development/model-associations 
    svn/maintenance/version1.0.0 
    svn/trunk 

Esattamente quello che mi serviva. Grazie per l'intuizione, tutto.

+0

+1 per l'opzione di clonazione profonda – VonC

13

Puoi provare nirvdrum's svn2git (sembra il più aggiornato) per importare il tuo svn in un repository git?
(all'inizio del 2009, Paul menzionato questo iteman's svn2git in sostituzione di questo original jcoglan's svn2git, che era, come il suo autore citato: "un trucco veloce per ottenere il mio codice fuori della sovversione")

E 'meglio di git svn clone perché se si dispone di questo codice in svn:

trunk 
    ... 
    branches 
    1.x 
    2.x 
    tags 
    1.0.0 
    1.0.1 
    1.0.2 
    1.1.0 
    2.0.0 

git-svn passerà attraverso la storia impegnarsi a costruire un nuovo repo git.
E importerà tutti i rami e tag come rami svn remoti, mentre ciò che si vuole veramente è git-native branch locali e oggetti tag git.
Così, dopo l'importazione di questo progetto, si otterrebbe:

$ git branch 
    * master 
    $ git branch -a 
    * master 
    1.x 
    2.x 
    tags/1.0.0 
    tags/1.0.1 
    tags/1.0.2 
    tags/1.1.0 
    tags/2.0.0 
    trunk 
    $ git tag -l 
    [ empty ] 

Dopo svn2git è fatto con il progetto, si otterrà questo, invece:

$ git branch 
    * master 
    1.x 
    2.x 
    $ git tag -l 
    1.0.0 
    1.0.1 
    1.0.2 
    1.1.0 
    2.0.0 

Naturalmente, questa soluzione è non inteso come un viaggio a senso unico.

È sempre possibile tornare al repository svn, con ...git2svn (anche present there)

L'idea rimangono:

  • SVN sul lavoro come archivio centrale.

  • Git "altrove" per sperimentare rapidamente tra più rami Git-private.

  • importazione schiena rami Git solo consolidati in rami ufficiali SVN.

+0

ho visto questo commento su un altro post che era simile al mio problema. Sfortunatamente, non penso che questo funzionerà (anche se darò un'occhiata più da vicino a svn2git). Ho bisogno di interagire direttamente con i repository Svn. Ci sono altri membri del team che non sono pronti per Git. –

+0

+1 - Ho avuto problemi simili durante l'apprendimento di git, fino a quando non ho impostato un nuovo repository usando svn2git ei problemi sono scomparsi. Una versione più aggiornata è disponibile su http://github.com/iteman/svn2git/tree/master. – Paul

+0

@VonC - Come riavviare il clone se è stato interrotto a causa della mancata disponibilità della rete? – notionquest

9

Per i layout di pronti contro termine non servite da jolly semplici: (my answer-this related question)

Il current git-svn manpage dice:

E 'anche possibile prendere un sottoinsieme di rami o tag utilizzando un elenco di nomi separati da virgola all'interno delle parentesi graffe . Per esempio:

[svn-remote "huge-project"] 
    url = http://server.org/svn 
    fetch = trunk/src:refs/remotes/trunk 
    branches = branches/{red,green}/src:refs/remotes/branches/* 
    tags = tags/{1.0,2.0}/src:refs/remotes/tags/* 
+0

Ho seguito i tuoi passi e ho ottenuto 1 tag migrato. Mi piacerebbe ripetere lo stesso per il prossimo paio di tag. Ho provato ad aggiungere il terzo tag {1.0.2.0, 3.0} ed eseguire git svn fetch. Ma non sta recuperando nulla dal repository. Mi sto perdendo qualcosa? – notionquest