Últimos Cambios |
||
Blog personal: El hilo del laberinto |
Ú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 Ceadate: 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)
Los detalles de lo liberado.
Más información sobre los OpenBadges
Donación BitCoin: 19niBN42ac2pqDQFx6GJZxry2JQSFvwAfS