Migrar de Subversion a Git, sin mirar atrás
Este post no es realmente acerca de Java, pero quiero dejarlo en este sitio de todas maneras, ya que realmente no tengo otro blog y además no deja de ser algo muy técnico.
En mi trabajo desde hace varios años utilizamos Subversion, pero decidimos pasarnos a Git. El mismo Git incluye herramientas para integración con svn, pero son algo limitadas. Además creo que es un buen pretexto para aprovechar y reorganizar el repositorio, partiéndolo en varios repositorios distintos, abandonando algunas cosas obsoletas, ramas que llevan años abandonadas, etc.
En mi búsqueda por lograr esto, me encontré con esta herramienta llamada svn2git:
Parece que la desarrolló el equipo de KDE, para realizar lo mismo que yo estaba buscando: migrarse de una buena vez de svn a git, sin mirar atrás, reorganizando su código en varios repositorios, etc.
Esta herramienta está hecha en C++ y requiere Qt para poderse compilar, aunque no tiene interfaz gráfica. Debe ejecutarse en el servidor que contiene el repositorio de Subversion que se quiere migrar (no una copia de trabajo).
La manera en que trabaja es que se debe definir un archivo con las reglas que se aplicarán a cada directorio del repositorio en Subversion. Se pueden utilizar expresiones regulares para los nombres. Lo que hace este programa es aplicar cada commit de Subversion como un commit en el repositorio correspondiente de Git; dicho repositorio y el destino de dichos cambios serán determinados por las reglas que se definan.
Este es un ejemplo sencillo de reglas para partir un repositorio con dos proyectos, en dos repositorios separados:
Al ejecutar el programa con estas reglas, y apuntándolo al repositorio de Subversion, se crearán 2 repositorios de Git
y
. Las ramas de Subversion se convertirán en ramas de Git en cada proyecto y en el caso del proyecto 2, un directorio relacionado en Subversion lo metemos al repositorio de Git debajo de un directorio específico.
Incluso se puede conservar la identidad de los usuarios de Subversion en los commits que se registran en Git, haciendo un archivo con la lista de usuarios:
De este modo, los commits hechos por usuario1 de Subversion serán aplicados en Git a nombre de uno@dominio.com, incluyendo su nombre completo "Usuario Uno". Esto es especialmente útil si el repositorio de Git se va a hospedar en un sitio como GitHub o BitBucket, pues por el email es que se asociará cada commit a un usuario en ese sitio.
Los repositorios de Git resultantes, no son copias de trabajo; para obtener una copia de trabajo local simplemente se puede hacer, desde un directorio distinto:
por ejemplo. Esto sirve para revisar que hayan quedado bien migrados; hay que revisar que están todos los directorios que nos interesan, los archivos obviamente también, y por ejemplo revisar las ramas con
(en la copia de trabajo solamente estará la rama
pero este comando mostrará las ramas en el repositorio remoto, es decir, el original creado por svn2git).
Para pasar este repositorio a GitHub o BitBucket, simplemente hay que seguir las instrucciones que dan en el sitio: primero, crear el repositorio correspondiente ahí, con el mismo nombre. Luego, en el repositorio creado por svn2git (no en la copia de trabajo, sino en el repo como tal), ejecutar el comando de
que indiquen en el sitio correspondiente; después, ejecutar
y con eso se pasan todos los datos de la rama principal al respositorio correspondiente en el sitio elegido. Pero para copiar las otras ramas generadas, en caso de haberlas, hay que ejecutar adicionalmente un comando por cada rama, de esta forma:
(esto con cada rama que se quiera copiar al reposotorio remoto).
Lo que no encontré es cómo incluir por ejemplo un archivo que está en un directorio que no me interesa (más que ese archivo). Revisando el código fuente parece que hay directivas
para las reglas pero ya no las probé. En general el problema de este proyecto es que no hay documentación, pero realmente es poco código fuente y se puede revisar para tener idea de qué otras cosas reglas se pueden definir, incluso sin tener mucho conocimiento de C++.
- ezamudio's blog
- Inicie sesión o regístrese para enviar comentarios
+3000
+3000
Solo unos cuantos ...
Solo unos cuantos saben la alegria que me da esta entrada y el porque claro. Gracias ezamudio muy buena entrada :)
Yo la verdad nunca he usado
Yo la verdad nunca he usado ninguna de estas herramientas pero de ustedes y de otros he leído buenas criticas sobre git. Y por eso me anime a aprender a usarlo. Nomas dejen que consiga tiempo jajaja.
Y pues bueno, los post de @ezamudio siempre son buenos, no siempre entiendo todo pero son interesantes.
jaj
Ya para que parezca chamba de 2012 y no de 2004.
La razón por la que empezamos a usar Subversion es porque el proyecto comenzó en 2004, cuando Git todavía no existía, ni Bazaar, ni Mercurial ni nada de eso. No había presupuesto para comprar Bitkeeper tampoco, así que pues Subversion era la opción y la verdad es que ha salido muy bueno, pero el repositorio creció y creció y pues ya llegó el momento de reorganizar todo, y ese fue el pretexto para migrar a Git y hospedar el código en un servicio externo y quitarnos de dolores. Al final me fui por Bitbucket porque hacía más sentido para lo que necesitamos, ya que en Bitbucket alcanzamos el plan gratuito por el número de usuarios, mientras que en GitHub cobran por el número de repositorios y por ser organización el costo mensual sube (el mínimo son $25 USD al mes). Todo esto hablando de repositorios privados por supuesto.
git - la guía sencilla