hg convert

Tuve que separar un número selectos de archivos de un repositorio y de ellos crear uno nuevo. Me interesaba conservar el historial de cambios; y me encontré una página que decía que se podía hacer con hg convert.

Mi anterior experiencia con hg convert había sido breve y sin éxito: había querido mover un repositorio CVS a Mercurial. Pero en aquella ocasión el problema, si mal no recuerdo era que hg no encontraba el comando cvs.exe (por alguna razón cvsnt.exe no era aceptable).

Tiempo después lo logré en Linux (ver abajo).

Antes de empezar, se debe habilitar la extensión. En tu archivo hgrc, debes poner:

[extensions]
convert =

Extraer archivos a un repositorio nuevo

Pero para convertir de Mercurial a Mercurial, funcionó tal y como dice en la página (utilizando el parámetro filemap); pero con unas pequeñas modificaciones...

.. ya que por alguna extraña razón, tuve que poner cada archivo individualmente en una línea. Es decir que no pude hacer:

include "Queue.c Queue.h strf_utils.c strf_utils.h stdop.h"

(no me dejó hacer un update después) .. sino que tuve que poner lo siguiente:

include Queue.c
include Queue.h
include strf_utils.c
include strf_utils.h
include stdop.h

Y ya con eso si pude convertir el repositorio; ejecutando:

hg convert --filemap mapa.txt NombreRepoActual NombreDest

... remarcando que para que funcione, hay que hacer un update después de la conversión.

Moviendo archivos de un repositorio a otro

  1. En un experimento más avanzado, quise mover 4 archivos de un repositorio a otro. Por supuesto que el chiste era incluir el historial de revisiones.Fué relativamente sencillo:Primero cloné mis repositorios por si cometía errores.
  2. Luego usé hg convert para extraer los 4 archivos que me interesaba mover en un repositorio nuevo.
  3. Luego en el repositorio destino, hice un hg pull -f (donde -f indica que se quiere forzar).
  4. Luego hice un hg merge, para que incluyera los cambios de ambos repositorios (de lo contrario borra los archivos ya existentes en el destino).
  5. Finalizando con un hg commit; para que quedara registrado el merge.

La imágen a la derecha muestra la gráfica de cambios (en el TortoiseHg Workbench) después de haber hecho el merge.

Convertir de CVS a Mercurial

Tiempo después intenté de nuevo convertir de CVS a Mercurial; pero en esta ocasión en Linux.

Me topé con 2 errores:

Primero, que $CVSROOT apuntaba a /var/cvs; pero en realidad era un link a /otra/localidad. Bastó con cambiar el checkout de CVS a algo como:

cvs -d:ext:usuario@servidor:/otra/localidad co MiProyecto

El segundo problema fue que al hacer el hg convert MiProyecto, se trababa leyendo el historial. No supe a ciencia cierta cómo es que finalmente comenzó; pero lo interrumpí y reinicié varias veces. Afortunadamente, hg convert reanuda leyendo el historial desde donde se quedó.

De nueva cuenta: hay que hacer un update después de la conversión.

Enlaces

Workbench después del merge