2012-03-07 17 views
8

He estado trabajando en mover nuestros 9 proyectos en un repositorio SVN a 9 repositorios git separados, administrados en un servidor por gitolite y luego cerrando el SVN. Siete de ellos fueron fáciles ya que no tenían ramas o etiquetas así que en mi estación de trabajo que fue capaz de hacer un simple:¿Migrar de Subversion a git, clonar todas las ramas y avanzar a través de gitolita?

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

Luego empuja desde mi estación de trabajo a la gitolite sever a través de:

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

y todos han estado funcionando genial. Ahora los dos proyectos finales son más difíciles, con aproximadamente 30 etiquetas/ramas cada uno. Después de ejecutar el 'svn git clone' que el anterior en uno de esos proyectos que veo:

$ 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 

Ahora, ¿cómo hago para conseguir todas esas etiquetas/ramas descargan en mi estación de trabajo local para que pueda empujar a través de gitolite y apagar el servidor SVN permanentemente? ¿Es lo que tengo que hacer en this guide, haciendo un 'git checkout -b' para cada rama y etiqueta? ¿Debo usar svn2git o alguna otra herramienta para esto?

Respuesta

11

Una persona útil en #git en el IRC de freenode me escribió una poco comando para obtener mis etiquetas y ramas copiado a Git desde SVN:

ramas 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 Ejecutar el cual que imprime

etiquetas de empuje:

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 Ejecutar el cual que imprime

+1

¿qué quieres decir con ejecutar el comando que se imprime ??? –

+0

Oh, su salida es un comando ... gracias tuve muchas ramas que me hacen confundir ... –

+0

Funciona para mí. Pero ¿por qué no hay ningún comando ootb git para ello? O bien, ¿por qué git push --all fallan para git svn branches? – Christian

0

Ya están en su estación de trabajo local. Lo que ves son solo referencias a confirmaciones y puedes consultar las sucursales locales que las rastrean cuando lo desees.

git branch -a 

Muestra la información que está en su repositorio local, no recuperando ningún dato del repositorio remoto. Obtuviste toda esa información cuando hiciste el clon.

Ahora que tenemos todo lo local, solo necesita enviar los datos al control remoto. Usted puede empujar todas sus etiquetas con el servidor remoto con:

git push --tags 

Para cada rama puede empujarlo al repositorio con:

git push origin remotes/BatchUpload:BatchUpload 
+0

corriendo 'git push - etiquetas' responde con "Todo al día" y ninguna otra salida, igual que con 'git push origin remotes/*: refs/heads/*' que es supuestamente la misma cosa que mencionaste anteriormente ? Sin embargo, no parece que existan ramas o etiquetas en el servidor después de ejecutar esos comandos. – xref

+0

Hmm ok, entonces probablemente tengas que convertirlas en etiquetas manualmente o con un script. Si echa un vistazo, por ejemplo, a los controles remotos/etiquetas/release-2.1.2 con "git checkout remotes/tags/release-2.1.2" ¿obtiene un HEAD separado? – ralphtheninja

+0

Parece que la conversión de svn a git crea las etiquetas como referencias remotas (pero con un nombre extraño), por lo que probablemente tenga que hacer, p. "git checkout controles remotos/etiquetas/xyz; git tag xyz;" para todos los archivos xyz en la carpeta .git/remotes/tags. Una vez hecho esto, las etiquetas de git push deben empujarlas al control remoto. Y tiene que hacer lo mismo con las referencias de bifurcación, git checkout -b xyz remotes/xyz (o simplemente git branch xyz remotes/xyz) y git push origin xyz para todos los archivos xyz en la carpeta .git/remotos. Cuando haya terminado, puede eliminar los archivos. – ralphtheninja

0

Uso svn2git. Esto convierte las etiquetas en etiquetas git anotada y estos entonces se empujan utilizando adecuadamente git push --tags

+1

¿Puede explicar cómo usar svn2git para resolver problemas específicos de OP? –

0

Esto es lo que funcionó para mí:

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

Este comando desplaza al resto de los mandos a distancia creados durante la subversión a git migración, visible con git branch -a. ¡Incluye todas las ramas/etiquetas eliminadas/fusionadas!

Deberá limpiar algunas ramas/etiquetas no deseadas, o quizás converting branches to tags.

Cuestiones relacionadas