Cómo clonar un enorme repositorio svn desde git

git es un manejador de versiones distribuido bastante interesante, que tiene una interfaz con Subversion llamada git-svn.

git

git

Si están en un sistema Debian o uno de sus sitemas derivados, instalarlo es sencillo:

apt-get install git-svn

Para clonar un repositorio svn completo es necesario especificar qué carpetas son el tronco, las ramas y las etiquetas, de modo que git pueda identificarlas.

Así que para clonar un repositorio svn en teoría sólo se necesita hacer lo que dice el manual

git svn clone http://svn.example.com/project -T trunk -b branches -t tags

Sin embargo, lo que hace git-svn clone es recabar cada uno de los commits realizados en el repositorio svn para almacenarlos en revisiones locales, como es natural pensar. Y justamente eso hace que sea muy costoso clonar un repositorio de un proyecto con muchos commits, por ejemplo uno de 18092 commits :D.

El problema es muy pequeño: ¿qué pasa si por alguna razón se pierde la conexión en el commit 15000? ¿se necesita rehacer la descarga? (notar que esta descarga podría demorar más o menos 1 día según la velocidad de conexión con el servidor svn, velocidad de PC local, etc)

La respuesta es no felizmente 😀

Cuando se están descargando las revisiones de subversion sólo se escribe el índice y no el árbol de archivos y carpetas, así que no encontrarán nada en el directorio que están clonando excepto la carpeta .git.

Luego que se haya cortado la descarga lo que tenemos que hacer es:

  • reescribir nuestra rama master(a la que apunta por defecto HEAD), a la última revisión obtenida(es sencillo ver cuál es el último hash en la salida del comando), esto es: si el hash es b977ed6c9b4a1c758b6c230d8f8e507ce78e074e:

echo b977ed6c9b4a1c758b6c230d8f8e507ce78e074e > .git/refs/heads/master

  • Luego de eso, ya sólo nos queda forzar quedarnos en la última versión descargada:

git reset --hard

  • Y cuando querramos seguir decargando el repo, pues actualizamos normalmente:

git svn rebase --all

Comments