Member of The Internet Defense League Últimos cambios
Últimos Cambios
Blog personal: El hilo del laberinto Geocaching

Migración del repositorio Subversion de Olimpo a Mercurial

Última Actualización: 24 de enero de 2013

Continúo la publicación de material antiguo pero interesante de IRC-Hispano.

La migración a Mercurial de este proyecto hubiese sido trivial si no fuese porque era necesario editar la historia para evitar la exposición de ciertos detalles confidenciales. Mercurial hace un gran esfuerzo por evitar que se pueda alterar la historia, algo que le elogio y valoro mucho, pero en este caso es un problema.

El primer paso es migrar el Subversion a Mercurial:

rm -r olimpo-hg/* olimpo-hg/.*

echo "jcea=Jesus Cea <jcea@jcea.es>" >authors.txt
echo "unknown=Jesus Cea <jcea@jcea.es>" >>authors.txt

echo "v1_66 v1_66old" > branchmap.txt

cat >filemap.txt <<EOF
exclude factura/facturas.email
exclude factura/facturas.final
exclude factura/facturas.24May00.email
exclude factura/facturas.24May00.final
exclude factura/facturas.27abr00.email
exclude factura/facturas.27abr00.final
exclude factura/facturas.dic99.email
exclude factura/facturas.dic99.final
exclude factura/facturas.feb00.email
exclude factura/facturas.feb00.final
exclude factura/facturas.marzo00.email
exclude factura/facturas.marzo00.final
exclude factura/z
exclude claves_de_cifrado
exclude claves_de_cifrado.20030613
exclude z7.plantilla_headers
exclude ilines.db
exclude old/historico.log2.gz
exclude old/ilines_db
exclude old/ilines.db
exclude old/ilines.db.old
exclude old/ilines.db.old2
exclude old/olimpo.log.old
exclude old/squit.raw.old
EOF

hg convert --datesort \
           --authors authors.txt \
           --branchmap branchmap.txt \
           --filemap filemap.txt \
             olimpo-SOURCE olimpo-hg

Cambiar el nombre de la rama se justificará más abajo :-). También filtramos unos cuantos ficheros confidenciales.

Hay unos cuantos cambios que quiero proteger en ficheros que se conservarán en el repositorio, así que utilizaré la extensión "histedit". Lamentablemente la extensión no permite editar revisiones cuyos sucesores no tengan una historia estrictamente lineal, así que el siguiente paso consiste en clonar el repositorio dejando atrás la rama "v1_66", que ahora llamamos "v1_66old":

$ hg clone -r default olimpo-hg olimpo-hg2
$ cd olimpo.hg2
$ hg phase --force --draft -r0:tip

El último paso es necesario porque al hacer el "hg clone" la historia actual de la copia se marca como "inmutable". Bravo por Mercurial, que me protege el culo de errores, pero en este caso necesito poder modificar la historia "a saco". En general esto es una receta para el desastre -y Mercurial me lo deja claro- pero ahora es algo que necesito y se trata de algo seguro, porque nadie más tiene una copia del repositorio aún, así que editarle las tripas es una barbaridad aceptable.

A continuación uso "hg grep" y "hg histedit" para localizar y editar la historia que necesito "limpiar". Es una tarea larga y coñazo, y proclive a meter la pata. Hago copias del repositorio de vez en cuando, para poder volver a atrás sin perder mucho trabajo si cometo un error.

Tras este paso tenemos un repositorio lineal limpito. Pero necesitamos traernos también la rama "v1_66". Esto va a ser muy problemático porque dicha rama se ancla en la versión de la historia no modificada. Tendremos que hacerle un "rebase" hacia la historia modificada. Como voy a hacer una trabajo delicado, hago una copia primero del estado del repositorio actual. Si me equivoco, puedo empezar de nuevo aquí, en vez de empezar desde cero.

$ cp -a ../olimpo-hg2 ../olimpo-hg2-SIN_BRANCH
$ hg pull ../olimpo-hg/
pulling from ../olimpo-hg/
searching for changes
adding changesets
adding manifests
adding file changes
added 2044 changesets with 278 changes to 91 files (+2 heads)
(run 'hg heads .' to see heads, 'hg merge' to merge)
caching new largefiles
0 largefiles cached

Tenemos dos "heads" nuevos porque uno es la rama que nos interesa, y el otro es la historia sin modificar. Nos desharemos de ella más tarde.

Localizamos el punto de salida que nos interesa en la rama nueva, la creamos y hacemos un "rebase" de la rama antigua:

$ hg up -r 312
$ hg branch v1_66
marked working directory as branch v1_66
(branches are permanent and global, did you want a bookmark?)
$ hg comm -m "CREAMOS BRANCH"
$ hg phase --force --draft -r0:tip
$ hg rebase -r "branch(v1_66old)" -d v1_66
saved backup bundle to /tmp/z/olimpo-hg2/.hg/strip-backup/HASH_OCULTO-backup.hg

Me voy al punto de partida de lo que será la nueva rama movida, creo la rama "v1_66" (por eso habíamos renombrado la rama a "v1_66old" en la conversión inicial, para poder utilizar el nombre ahora) y luego movemos la rama.

Obsérvese el uso de revsets Mercurial. No podemos hacer simplemente un "hg rebase -b v1_66old -d v1_66", porque entonces se traería también parte de la rama principal. Aquí estamos seleccionando exclusivamente las revisiones que pertenecen a la rama a mover.

Como la vieja rama "v1_66old" ya no tiene ningún "changeset", simplemente desaparece.

El siguiente paso es eliminar la historia de "default" sin modificar:

$ hg heads
changeset:   4300:HASH_OCULTO
branch:      v1_66
tag:         tip
user:        Jesus Cea 
date:        Thu Jul 31 17:59:15 2003 +0000
summary:     *** empty log message ***

changeset:   4261:HASH_OCULTO
user:        convert-repo
date:        Mon Jan 21 13:01:30 2013 +0000
summary:     update tags

changeset:   2255:HASH_OCULTO
user:        convert-repo
date:        Mon Jan 21 13:01:30 2013 +0000
summary:     update tags

$ cd ..
$ hg clone -r 2255 olimpo-hg2 olimpo-hg3
adding changesets
adding manifests
adding file changes
added 2256 changesets with 3515 changes to 112 files
updating to branch default
102 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cd olimpo-hg3
$ hg pull -r v1_66 ../olimpo-hg2
pulling from ../olimpo-hg2
searching for changes
adding changesets
adding manifests
adding file changes
added 39 changesets with 40 changes to 3 files (+1 heads)
(run 'hg heads' to see heads)
caching new largefiles
0 largefiles cached
$ hg heads
changeset:   2294:HASH_OCULTO
branch:      v1_66
tag:         tip
user:        Jesus Cea 
date:        Thu Jul 31 17:59:15 2003 +0000
summary:     *** empty log message ***

changeset:   2255:HASH_OCULTO
user:        convert-repo
date:        Mon Jan 21 13:01:30 2013 +0000
summary:     update tags
$ hg phase --force --draft -r0:tip

A continuación volvemos a hacer "hg grep" y "hg histedit" para limpiar la historia que no queremos hacer pública en la rama "v1_66". Nuevamente trabajo coñazo y delicado. Nuevamente hago copias de vez en cuando para no tener que empezar de cero si la fastidio por error.

Parece que hemos terminado, pero queda una comprobación final. Como hemos hecho una barbaridad de cambios delicados, queremos comprobar que la versión final de ambas ramas sea igual a la versión original, salvo por los cambios que no deseamos publicar. Así nos quedamos tranquilos porque por un lado no estamos publicando nada inconveniente y por otro, la historia editada es consistente y no hemos cometido errores. Para ello hago:

$ ( cd ../olimpo-hg; hg up -r default )
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg up -r default
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ diff -ur -x .hg ../olimpo-hg .
(Los únicos cambios mostrados corresponden a la información que no queremos publicar)
$ ( cd ../olimpo-hg; hg up -r v1_66old )
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg up -r v1_66
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ diff -ur -x .hg ../olimpo-hg .
(Los únicos cambios mostrados corresponden a la información que no queremos publicar)

El resultado.

Los detalles de lo liberado.


Historia

  • 24/ene/13: Primera versión de este documento.



Python Zope ©2013 jcea@jcea.es

Más información sobre los OpenBadges

Donación BitCoin: 19niBN42ac2pqDQFx6GJZxry2JQSFvwAfS