version-control mercurial tortoisehg commit-message mercurial-commit

version control - ¿Cómo editar un mensaje de confirmación incorrecto en Mercurial?



version-control tortoisehg (12)

Esta pregunta ya tiene una respuesta aquí:

Actualmente estoy usando TortoiseHg (Mercurial) y accidentalmente cometí un mensaje de confirmación incorrecto. ¿Cómo hago para editar este mensaje de confirmación en el repositorio?


La última operación fue el compromiso en cuestión.

Para cambiar el mensaje de confirmación de la última confirmación cuando la última operación comercial fue una confirmación que puede utilizar

$ hg rollback

para deshacer la última confirmación y volver a confirmarla con el nuevo mensaje:

$ hg ci -m ''new message''

Pero tenga cuidado porque el comando rollback también deshace las siguientes operaciones:

  • importar
    • Halar
    • push (con este repositorio como destino)
    • desagregar

(ver hg help rollback )

Por lo tanto, si no está seguro de si el último comando de mercurio fue un hg ci , no use el hg rollback .

Cambia cualquier otro mensaje de confirmación.

Puede usar la extensión mq , que se distribuye con Mercurial, para cambiar el mensaje de confirmación de cualquier confirmación.

Este enfoque solo es útil cuando todavía no hay repositorios clonados en el público que contengan el conjunto de cambios al que desea cambiar el nombre, ya que esto altera el hash del conjunto de cambios y todos los conjuntos de cambios siguientes.

Eso significa que tiene que poder eliminar todos los clones existentes que incluyen el conjunto de cambios cuyo nombre desea cambiar, o de lo contrario no funcionaría empujar / jalar entre ellos.

Para usar la extensión mq, debe habilitarla explícitamente, por ejemplo, bajo UNIX verifique su ~/.hgrc , que debe contener las siguientes líneas:

[extensions] mq=

Digamos que desea cambiar la revisión X: primero, qimport importa las revisiones X y siguientes. Ahora están registrados como una pila de parches aplicados. Al qpop ( qpop ) la pila completa, excepto X, hace que X esté disponible para cambios a través de qrefresh . Después de cambiar el mensaje de confirmación, debe presionar todos los parches nuevamente ( qpop ) para volver a aplicarlos, es decir, para volver a crear las siguientes revisiones. La pila de parches no es necesaria, por lo que se puede eliminar a través de qfinish .

El siguiente script de demostración muestra todas las operaciones en acción. En el ejemplo, se renombra el mensaje de confirmación del tercer conjunto de cambios.

# test.sh set -x -e -u echo INFO: Delete old stuff rm -rf .hg `seq 5` echo INFO: Setup repository with 5 revisions hg init echo ''[ui]'' > .hg/hgrc echo ''username=Joe User <[email protected]>'' >> .hg/hgrc echo ''style = compact'' >> .hg/hgrc for i in `seq 5`; do touch $i && hg add $i && hg ci -m "changeset message $i" $i done hg log echo INFO: Need to rename the commit message or the 3rd revision echo INFO: Displays all patches hg qseries echo INFO: Import all revisions including the 3rd to the last one as patches hg qimport -r 2:tip hg qseries echo INFO: Pop patches hg qpop 2.diff hg qseries hg log hg parent hg qrefresh -m ''CHANGED MESSAGE'' hg log echo INFO: Push all remaining patches hg qpush -a hg log hg qseries echo INFO: Remove all patches hg qfinish -a hg qseries && hg log && hg parent

Cópialo en un directorio vacío y ejecútalo, por ejemplo, a través de:

$ bash test.sh 2>&1 | tee log

La salida debe incluir el mensaje original de conjunto de cambios:

+ hg log [..] 2 53bc13f21b04 2011-08-31 17:26 +0200 juser changeset message 3

Y la operación de cambio de nombre del mensaje cambiado:

+ hg log [..] 2 3ff8a832d057 2011-08-31 17:26 +0200 juser CHANGED MESSAGE

(Probado con Mercurial 1.7.5)


Buenas noticias: hg 2.2 acaba de agregar git como opción --amend .

y en tortoiseHg, puede usar "Modificar revisión actual" seleccionando la flecha negra a la derecha del botón de confirmación


Bueno, solía hacerlo de esta manera:

Imagínese, tiene 500 confirmaciones y su mensaje de confirmación erróneo está en r.498.

hg qimport -r 498:tip hg qpop -a joe .hg/patches/498.diff (change the comment, after the mercurial header) hg qpush -a hg qdelete -r qbase:qtip


Como han mencionado otros, la extensión MQ es mucho más adecuada para esta tarea, y no corre el riesgo de destruir su trabajo. Para hacer esto:

  1. Habilite la extensión MQ, agregando algo como esto a su hgrc:

    [extensions] mq =

  2. Actualice al conjunto de cambios que desea editar, normalmente sugerencia:

    hg up <rev>

  3. Importar el conjunto de cambios actual en la cola:

    hg qimport -r .

  4. Actualice el parche y edite el mensaje de confirmación:

    hg qrefresh -e

  5. Termine todos los parches aplicados (uno, en este caso) y almacénelos como conjuntos de cambios regulares:

    hg qfinish -a

No estoy familiarizado con TortoiseHg, pero los comandos deben ser similares a los anteriores. También creo que vale la pena mencionar que editar la historia es arriesgado; solo debes hacerlo si estás absolutamente seguro de que el conjunto de cambios no ha sido empujado o extraído de ningún otro lugar.


En TortoiseHg, haga clic con el botón derecho en la revisión que desea modificar. Seleccione Modificar historial-> Importar MQ. Eso convertirá todas las revisiones hasta e incluyendo la revisión seleccionada de los conjuntos de cambios de Mercurial en los parches de cola de Mercurial. Seleccione el parche para el que desea modificar el mensaje, y debería cambiar automáticamente la pantalla al editor MQ. Edite el mensaje que se encuentra en el centro de la pantalla, luego haga clic en QRefresh. Finalmente, haga clic con el botón derecho en el parche y elija Modificar historial-> Terminar parche, que lo convertirá de un parche nuevamente en un conjunto de cambios.

Oh, esto supone que MQ es una extensión activa para TortoiseHG en este repositorio. De lo contrario, debería poder hacer clic en Archivo-> Configuración, hacer clic en Extensiones y hacer clic en la casilla de verificación mq. Debería advertirle que debe cerrar TortoiseHg antes de que la extensión esté activa, así que cierre y vuelva a abrir.


Hay otro enfoque con la extensión MQ y los comandos de depuración . Esta es una forma general de modificar el historial sin perder datos. Déjame asumir la misma situación que Antonio .

// set current tip to rev 497 hg debugsetparents 497 hg debugrebuildstate // hg add/remove if needed hg commit hg strip [-n] 498


Lo hice de esta manera. En primer lugar, no empujes tus cambios o estás fuera de suerte. Agarra e instala la extensión de collapse . Cometer otro conjunto de cambios ficticios. Luego usa el colapso para combinar los dos conjuntos de cambios anteriores en uno. Le pedirá un nuevo mensaje de confirmación, que le dará los mensajes que ya tiene como punto de partida. Has cambiado efectivamente tu mensaje de confirmación original.


Revertir y volver a aplicar es una solución realmente simple, pero solo puede ayudar con el último compromiso. Las colas de Mercurial son mucho más poderosas (tenga en cuenta que necesita habilitar la Extensión de colas de Mercurial para usar los comandos "hg q *").



Un truco que uso si la revisión que quiero editar no es tan antigua:

Digamos que estás en Rev 500 y quieres editar 497.

hg export -o rev497 497 hg export -o rev498 498 hg export -o rev499 499 hg export -o rev500 500

Edite el archivo rev497 y cambie el mensaje. (Es después de las primeras líneas precedidas por "#")

hg import rev497 hg import rev498 hg import rev499 hg import rev500


Una pequeña joya en la discusión anterior, gracias a @Codest y @Kevin Pullin. En TortoiseHg, hay una opción desplegable junto al botón de confirmación. La selección de "Modificar la revisión actual" devuelve el comentario y la lista de archivos. Tan útil.


Actualización: Mercurial ha agregado --amend que debería ser la opción preferida ahora .

Puede revertir la última confirmación (pero solo la última) con hg rollback y luego volver a aplicarla.

Importante : esto elimina permanentemente la última confirmación (o extracción). Entonces, si has hecho una hg update que el commit ya no está en tu directorio de trabajo, entonces se ha ido para siempre. Así que haz una copia primero.

Aparte de eso, no puede cambiar el historial del repositorio (incluidos los mensajes de confirmación), porque todo lo que hay allí es suma de verificación. Lo único que podría hacer es podar el historial después de un conjunto de cambios determinado y luego recrearlo en consecuencia.

Nada de esto funcionará si ya ha publicado sus cambios (a menos que pueda obtener todas las copias), y tampoco puede "reescribir el historial" que incluye confirmaciones firmadas por GPG (por otras personas).