2012-03-07 14 views
8

Ho lavorato per spostare i nostri 9 progetti in un repository SVN su 9 distinti repository git, gestiti su un server da gitolite e poi chiudendo SVN. Sette di loro erano facile come non avevano rami o tag presente sulla mia workstation sono stato in grado di fare un semplice:Migrare da Subversion a git, clonare tutti i rami e spingere attraverso la gitolite?

git svn clone --stdlayout --no-metadata -A svnauthors.txt svn+ssh://[email protected]/var/subversion/project tempProject 

poi spinto dalla mia postazione di lavoro alla gitolite Sever via:

git remote add origin ssh://[email protected]/project 
git push -u origin master 

e hanno lavorato tutti alla grande. Ora gli ultimi due progetti sono più difficili, con circa 30 tag/rami ciascuno. Dopo aver eseguito il 'git svn clone' come sopra su uno di quei progetti che vedo:

$ git branch -a 
* master 
    remotes/BatchUpload 
    remotes/clarify_breadcrumb 
    remotes/contact_type 
    remotes/contact_upload_improvements 
    remotes/file_cabinet 
    remotes/mobile 
    remotes/summary_tiles 
    remotes/summary_updates 
    remotes/tags/release-2.1.2 
    remotes/tags/release-3.0.1 
    remotes/tags/release-3.0.2 
    remotes/tags/release-3.0.2c 
    remotes/tags/release-3.1.1 
    remotes/tags/release-3.1.3 
    remotes/tags/release-3.1.4 
    remotes/tags/release-3.1.5 
    remotes/tags/release-3.1.5.UPDT 
    remotes/tags/release-3.2 
    remotes/tags/release-3.2.1 
    remotes/tags/release-3.2.2.1 
    remotes/tags/release-3.2.3 
    remotes/tags/release-3.2.4 
    remotes/tags/release-3.2.6 
    remotes/tags/release-3.2.7 
    remotes/tags/release-3.2.7.1 
    remotes/trunk 
    remotes/user_man_batch_upload 
    remotes/user_management 

Ora, come posso fare per ottenere tutti quei tag/rami scaricato alla mia postazione di lavoro locale, in modo che io possa far passare gitolite e spegnere il server SVN in modo permanente? È quello che devo fare in this guide, fare un 'git checkout -b' per ogni ramo e tag? Dovrei usare svn2git o qualche altro strumento per questo?

risposta

11

Una persona utile per #git su freenode IRC mi ha scritto una poco comando per ottenere la mia tag e rami copiato a Git da SVN:

rami push:

printf "git push origin "; git show-ref | grep refs/remotes | grep -v '@' | grep -v remotes/tags | perl -ne 'print "refs/remotes/$1:refs/heads/$1 " if m!refs/remotes/(.*)!'; echo 

comando Esegui che che stampa

tag push:

printf "git push origin "; git show-ref | grep refs/remotes/tags | grep -v '@' | perl -ne 'print "refs/remotes/tags/$1:refs/tags/$1 " if m!refs/remotes/tags/(.*)!'; echo 

comando Esegui che che stampa

+1

cosa intendi per comando di marcia che stampa? –

+0

Oh la sua uscita è un comando .. grazie ho avuto molti rami che mi fanno confondere ... –

+0

Funziona per me. Ma perché non esiste un comando git ootb per questo? Oppure, perché git push fallisce per i rami svn di git? – Christian

0

Sono già sulla stazione di lavoro locale. Quello che vedi sono solo riferimenti a commit e puoi controllare i rami locali rintracciarli quando vuoi.

git branch -a 

Mostra le informazioni presenti nel repository locale, non recuperando alcun dato dal repository remoto. Hai tutte queste informazioni quando hai fatto il clone.

Quindi ora che disponiamo di tutto il locale, è sufficiente inviare i dati al telecomando. Si può spingere tutti i tag al server remoto con:

git push --tags 

Per ogni ramo si può spingere al pronti contro termine con:

git push origin remotes/BatchUpload:BatchUpload 
+0

in esecuzione 'git push --tags' risponde con "Tutto aggiornato" e nessun'altra uscita, lo stesso con l'esecuzione di 'git push origine telecomandi/*: refs/teste/*' che è presumibilmente la stessa cosa che hai elencato sopra ? Tuttavia non sembra che sul server esistano succursali o tag dopo aver eseguito quei comandi. – xref

+0

Hmm ok, quindi probabilmente devi convertirli in tag manualmente o con uno script. Se controlli ad esempio telecomandi/tag/release-2.1.2 con "git checkout remotes/tags/release-2.1.2" ottieni un HEAD distaccato? – ralphtheninja

+0

Sembra che la conversione da svn a git crei i tag come riferimenti remoti (ma con una denominazione strana), quindi probabilmente devi fare ad es. "git checkout remotes/tags/xyz; git tag xyz;" per tutti i file xyz nella cartella .git/remotes/tags. Una volta fatto, git push --tags dovrebbe spingerli al telecomando. E devi fare lo stesso con i riferimenti di ramo, git checkout -b xyz remotes/xyz (o semplicemente git branch xyz remotes/xyz) e git push origin xyz per tutti i file xyz nella cartella .git/remotes. Quando hai finito, puoi eliminare i file. – ralphtheninja

0

Usa svn2git. Questo trasforma i tag in git annotato tag e questi vengono poi spinto utilizza correttamente git push --tags

+1

Puoi approfondire come utilizzare svn2git per risolvere il problema specifico di OP? –

0

Questo è ciò che ha funzionato per me:

git push origin refs/remotes/*:refs/heads/* 

Questo comando spinge tutti i telecomandi creati durante la sovversione a git migrazione, visibile con git branch -a. Include tutti i rami/tag eliminati/uniti!

È necessario pulire alcuni rami/tag indesiderati, o forse converting branches to tags.

Problemi correlati