svn git git-svn

Conversión de svn a git, ¿cómo hacer que las ramas no sean remotas en el repositorio de svn?



git-svn (4)

Soy bastante nuevo en git y estoy tratando de mover un repositorio svn a git. Seguí la guía a continuación, así que ahora tengo un repositorio git en mi servidor
http://pauldowman.com/2008/07/26/how-to-convert-from-subversion-to-git/

Entonces, si hago "git branch", git responde "* master" y si hago "git branch -r" obtengo una lista de todas las sucursales en el repositorio de svn.

Mis últimos svn-checkins han estado en una de las ramas, pero cuando hice el "clon de git svn", mis confirmaciones en esa rama (aún no se han fusionado en el tronco) están 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 maestra y no las ramas remotas ".

Ya que estamos eliminando todos los svn-repo, me gustaría tener todas las ramas svn en el git-repo para que puedan acceder a ellos desde los clientes desarrolladores.

Una vez más, no soy un novato total, pero no muy lejos de eso. Así que si hay algo fundamental, me estoy perdiendo, por favor, dímelo.

Actualizar
Después de hacer un poco de RTFM (man git-svn) resolví el primer problema con las cosas de rama presentes en la rama maestra

reinicio - mandos a distancia / tronco

Ahora el tronco y la rama maestra son lo mismo. Ahora, lo siguiente es descubrir cómo obtener las sucursales de los clientes de desarrollo.

Actualización 2
Lo conseguí trabajando combinando la url anterior y la url que Scott señaló. Así, desde el principio.

La primera vez que creé un repositorio vacío en el servidor, se guardan en / usr / local / git-repos en nuestro servidor:

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

Luego cloné el repositorio svn a mi máquina dev (tenga en cuenta que en nuestro servidor svn, el directorio de "sucursales" se llama "ramificación" sin las ''s''):

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

Luego un poco de limpieza para poner 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 jorgen@<our_server>:/usr/local/git-repos/my_project.git

Finalmente, empuje todas las ramas y etiquetas hasta el servidor:

dev> git push origin --all

Oye, ahora ya lo tienes, ahora puedo deshacerme de ese svn-repo.

Actualización 3
Echa un vistazo a ebneters publicar a continuación para una manera más fácil de hacerlo ...


Hay una explicación bastante detallada sobre cómo realizar una importación SVN bastante buena que explica cómo convertir las sucursales correctamente 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 de ayuda.


He migrado 2 repositorios svn a git (git versión 1.7.0.4) siguiendo la receta de Scott, una más pequeña y una 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 presioné ninguna etiqueta y en su lugar tuve que hacer esto:

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

Esto puede no ser obvio en la bandera --todo y en el capítulo del libro y me di cuenta de esto después de haber eliminado el repositorio local de git svn.


La solución de Scott no funcionó para mí. Sospecho que algo pudo 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 que se recolecta basura de manera agresiva 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 / remotes estaba completamente vacío excepto por un directorio de etiquetas, que también estaba vacío. Así que no hay nada que pueda copiar para hacerlo bien.

Después de buscar algo, pude arreglarlo revisando el archivo .git / packed-refs y haciendo una búsqueda y reemplazo en lo 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 tampoco produjo un resultado utilizable para mí (no importó ningún compromiso después de un cierto punto hace varios meses, y todas las sucursales mostraron el mismo compromiso). Por ahora, he renunciado a svn2git y he tenido el mayor éxito al usar git-svn combinado con lo anterior.

Ojalá: seguro que 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.


Otra buena manera de hacer esto, solo para el registro, es usar svn2git . Estoy en medio de la conversión de varios repositorios bastante grandes y ha sido una bendición. Automatiza todos los pasos necesarios para cuidar de las sucursales y convertir las etiquetas svn en etiquetas git reales.