version control - ¿Cómo editar un mensaje de confirmación incorrecto en Mercurial?
version-control tortoisehg (12)
Esta pregunta ya tiene una respuesta aquí:
- Mercurial: ¿Cómo modificar el último commit? 6 respuestas
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:
- Habilite la extensión MQ, agregando algo como esto a su hgrc:
[extensions] mq =
- Actualice al conjunto de cambios que desea editar, normalmente sugerencia:
hg up <rev>
- Importar el conjunto de cambios actual en la cola:
hg qimport -r .
- Actualice el parche y edite el mensaje de confirmación:
hg qrefresh -e
- 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 *").
Sé que este es un post antiguo y que marcó la pregunta como respondida. Hace poco estuve buscando lo mismo y me pareció muy útil la extensión de histedit
. El proceso se explica aquí:
http://knowledgestockpile.blogspot.com/2010/12/changing-commit-message-of-revision-in.html
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).