2009-10-18 5 views
15

Soy bastante nuevo en git y estoy tratando de mover un repositorio svn a git. Me seguido la siguiente guía por lo que ahora tengo un repositorio git en mi servidor
http://pauldowman.com/2008/07/26/how-to-convert-from-subversion-to-git/Convirtiendo svn a git, ¿cómo conseguir que las ramas no sean solo remotas en el repositorio svn?

Por lo tanto, si lo hago "rama git git" respuestas "* maestro" y si lo hago "rama git-r" i obtener una lista de todas las ramas en el repositorio svn.

Mis últimos svn-checkins han estado en una de las ramas, pero cuando hice el "git svn clone": mis commits en esa rama (aún no se han fusionado en el tronco) son visibles en mi (git) rama principal. ¿Que me estoy perdiendo aqui?

Además, si en mi máquina de desarrollo hago "git clone" obtengo los archivos correctamente. Pero si hago "git branch -r" solo puedo ver la rama principal y no las sucursales remotas ".

Como nos estamos deshaciendo del svn-repo todos juntos, me gustaría tener todas las ramas svn en el git-repo para que se pueda acceder desde los clientes desarrolladores.

Una vez más, no soy un completo novato, pero no muy lejos de él. Si hay algo fundamental que me falta aquí, por favor dígame .

actualización
Después de hacer algunas RTFM (hombre git-svn) he resuelto el primer problema con la materia presente en la rama rama principal

mandos a distancia del tronco/

reinicio --hard Ahora el tronco y la rama principal son los mismos. Ahora, lo siguiente es averiguar cómo obtener las sucursales de los clientes de desarrollo.

Actualización 2
Lo tengo trabajo mediante la combinación de la URL anterior y la url que Scott señaló. Entonces, desde el principio.

por primera vez creado un repositorio vacío en el servidor, que se mantienen en/git-repos/usr/local en nuestro servidor:

server> cd /usr/local/git-repos 
server> mkdir my_project.git 
server> cd my_project.git 
server> git init 

Entonces me clonaron el SVN-repositorio para mi dev-máquina (señalar, que en nuestro servidor sVN el directorio "ramas" se denomina "rama" witout la 's'):

dev> git svn clone http://<svn.server>/my_project --no-metadata -A authors.txt -t tags -b branch -T trunk my_project 

Entonces algunos de limpieza para conseguir las etiquetas y ramas en orden:

dev> cp -Rf .git/refs/remotes/tags/* .git/refs/tags/ 
dev> rm -Rf .git/refs/remotes/tags 
dev> cp -Rf .git/refs/remotes/* .git/refs/heads/ 
dev> rm -Rf .git/refs/remotes 

Ahora agregue mi servidor como un repositorio remoto:

dev> git remote add origin [email protected]<our_server>:/usr/local/git-repos/my_project.git 

Por último, empujar todas las ramas y las etiquetas de seguridad en el servidor:

dev> git push origin --all 

Uf, ahora no lo tienes, ahora puede deshacerse de ese svn-repo.

Actualización 3
Pedido ebneters post por debajo de una manera más fácil de hacerlo ...

Respuesta

14

Hay una explicación muy detallada sobre cómo hacer un buen importación SVN que explica cómo convertir las ramas adecuadamente aquí:

https://git-scm.com/book/en/v1/Git-and-Other-Systems-Migrating-to-Git

La respuesta corta es ejecutar esto:

$ cp -Rf .git/refs/remotes/* .git/refs/heads/ 
$ rm -Rf .git/refs/remotes 

Espero que sea útil.

+0

Utilicé este método en un espejo git de un servidor svn del cual sigo buscando, y esto de alguna manera rompe el historial. Es eso esperado o estoy haciendo algo mal. – Doppelganger

8

Otra buena manera de hacer esto, solo para el registro, es usar svn2git - Estoy en el medio de convertir varios repositorios bastante grandes y ha sido un regalo del cielo. Automatiza todos los pasos necesarios para encargarse de las sucursales y convertir las etiquetas svn en etiquetas git reales.

+0

Ah, eso me habría ahorrado mucho trabajo. Pero bueno, al menos sé más sobre git ahora que antes ...:) –

5

La solución de Scott no funcionó para mí. Sospecho que algo puede haber cambiado en una versión reciente de git-svn desde que publicó eso (y desde que se escribió el libro vinculado), ya que parece recolectar basura agresivamente tan pronto como se completa el clon. Pero esto es solo una suposición de por qué no funcionó. Estoy usando git 1.6.5.6.

Específicamente, mi directorio .git/refs/remotos estaba completamente vacío a excepción de un directorio de etiquetas, que también estaba vacío. Entonces no hay nada que pueda copiar para hacerlo bien.

Después de algún hurgando, yo era capaz de solucionar este problema mediante la comprobación de los .git archivo/REF-envasados ​​y haciendo de búsqueda y reemplazo en el siguiente (en este orden):

refs/remotes/tags => refs/tags 
refs/remotes => refs/heads 

Si su editor es vim, puede hacerlo con estos dos comandos:

:%s/refs\/remotes\/tags/refs\/tags/g 
:%s/refs\/remotes/refs\/heads/g 

svn2git 1.3.1 también no produjo un resultado útil para mí (no importó ningún commit después de cierto punto hace varios meses, y sucursales en todo mostró los mismos commits). Por ahora he renunciado a svn2git y he tenido el mayor éxito usando git-svn combinado con lo anterior.

ilusión: seguro sería bueno si git-svn simplemente agregara un comando como 'abandonar' o 'migrar' que automatizaría este proceso de una manera segura para el futuro.

1

He migrado 2 svn repos a git (versión de Git 1.7.0.4) siguiendo la receta de Scott, una más pequeña y otra más grande. El más pequeño se comportó como lo describe Scott en el capítulo del libro. El más grande requería la solución de David. Otra cosa es que

$ git push origin --all 

no empujar las etiquetas y en su lugar he tenido que hacer esto:

$ git push origin --all 
$ git push origin --tags 

Esto puede no ser evidente desde el --all pabellón y de que el capítulo del libro y yo se dio cuenta de esto después de haber eliminado el git svn repo local.

Cuestiones relacionadas