Home > desarrollo, Spanish, técnico > Cómo clonar un enorme repositorio svn desde git

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 :D

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

  1. Francisco
    March 30, 2011 at 5:04 am

    Gracias compadre justo lo que buscaba.

  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: