Con Mercurial, ¿cómo puedo "comprimir" una serie de conjuntos de cambios en uno antes de empujar?


Digamos que tengo un repositorio Mercurial local y uno remoto. Ahora, empiezo a trabajar en una función. Trabajo en ello, y cuando creo que está hecho, cometo el conjunto de cambios. Probando un poco más, me parece que podría mejorar aún más esta característica por ajustar algo en el código. Hago el cambio y me comprometo. 20 minutos después, encuentro que hay un error en esta nueva característica, así que lo arreglo y lo confirmo también.

Ahora tengo 3 conjuntos de cambios que realmente me gustaría enviar al repositorio remoto como un conjunto de cambios con el mensaje "Implementing feature X", por ejemplo.

¿Cómo puedo hacer esto sin mucha molestia? Creo que podría hacerlo con parches, pero parece mucho trabajo.

Author: Lucas, 2009-07-29

10 answers

¿Qué tal la extensión de colapso ?

 37
Author: Steve Losh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-30 02:44:29

El histeditar extensión es exactamente lo que usted está buscando.

hg histedit -o

O

hg histedit --outgoing

Mostrará una lista de los conjuntos de cambios salientes. De la lista se puede

  • Doblar 2 o más conjuntos de cambios creando un único conjunto de cambios
  • Soltar conjuntos de cambios eliminándolos del historial
  • Reordena los conjuntos de cambios como quieras.

Histedit le pedirá el nuevo mensaje de confirmación de los conjuntos de cambios plegados a los que por defecto los dos mensajes con "\n***\n" separándolos.

También puede obtener resultados similares utilizando la extensión mq, pero es mucho más difícil.

También puede usar la extensión collapse para simplemente plegar, pero no proporciona una interfaz de usuario tan agradable y no proporciona una forma de editar el mensaje de confirmación resultante. Editar el mensaje de confirmación resultante también permite limpiar el mensaje final, que es algo que siempre termino utilizando.

 48
Author: Stefan Rusek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-13 20:25:19

Sí, puede hacerlo con parches: Supongamos que su trabajo está en los conjuntos de cambios 100 a 110, ambos inclusive

  1. Crear un parche:

    % hg export -o mypatch 100:110 --git

  2. Actualización a 99:

    % hg update 99

  3. Aplique el parche con --no-commit (de lo contrario recuperará todos sus conjuntos de cambios):

    % hg import --no-commit mypatch

  4. Confirme todos los cambios a la vez:

    % hg commit

  5. Ahora tienes dos cabezas (110 y 111) que deberían ser equivalentes en términos de los archivos que producen en su directorio de trabajo maybe tal vez diff para la cordura antes de quitar los viejos:

    % hg strip 100

OK, ahora que lo he deletreado todo, parece largo, pero después de haberlo hecho un montón de veces yo mismo, no me parece que sea demasiado una tarea...

 19
Author: Arkady,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-08 11:24:55

Si está utilizando TortoiseHg, use solo puede seleccionar dos revisiones (use CTRL para seleccionar las no siguientes), haga clic con el botón derecho y seleccione "Comprimir historial".

Después de eso, obtendrá una nueva lista de cambios en new head a partir del primer cambio que seleccionó antes, contendrá todas las listas de cambios descendientes entre las que seleccionó.

Simplemente puede eliminar las listas de cambios antiguas si ya no las necesita: use MQ extensiones para ello. De nuevo, en TortoiseHg: haga clic derecho en la primera lista de cambios que necesita ser eliminada con todos sus descendientes, "Modificar historial -> Eliminar".

 19
Author: Rageous,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-08 19:23:09

Mi método preferido de usar mq para este plegado es usar TortoiseHg como se describe aquí. Sin embargo, se puede hacer fácilmente desde la línea de comandos de la siguiente manera:

hg qimport -r <first>:<last> 
    -- where <first> and <last> are the first and last changesets 
    -- in the range of revisions you want to collapse

hg qpop <first>.diff
    -- remove all except for the first patch from the queue
    -- note: mq names patches <#>.diff when it imports them, so we're using that here

hg qfold <next>.diff
    -- where <next> is <first>+1, then <first>+2, until you've reached <last>

hg qfinish -a
    -- apply the folded changeset back into the repository

(Puede haber una mejor manera de hacer el paso qfold, pero no soy consciente de ello, ya que normalmente uso TortoiseHg para esa operación.)

Parece un poco complicado al principio, pero una vez que has comenzado a usar mq, es bastante sencillo y natural plus además puedes hacer todo tipo de otras cosas con mq que pueden ser ¡muy útil!

 18
Author: Chris Phillips,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-30 04:20:34

hg collapse y hg histedit son las mejores maneras. O, más bien, sería la mejor manera, si funcionaran de manera confiable... Tengo histedit para bloquear con un volcado de pila en tres minutos. Collapse no es mucho mejor.

Pensé que podría compartir otros dos BKM: {[12]]}

  1. hg rebase --collapse

    Esta extensión se distribuye con Mercurial. Aún no he tenido problemas con él. Es posible que tenga que jugar algunos juegos para evitar las limitaciones hg rebase basically básicamente, no le gusta cambiar la base a un antepasado en la misma rama, con nombre o por defecto, aunque lo permite si se rebase entre ramas (con nombre).

  2. Mueva el repositorio (foo/.hg) al directorio de trabajo (bar) y sus archivos. No al revés.

Algunas personas han hablado de crear dos árboles de clones y copiar archivos entre ellos. O parchear entre ellos. En su lugar, es más fácil mover los directorios .hg.

hg clone project work
... lots of edits
... hg pull, merge, resolve
hg clone project, clean
mv work/.hg .hg.work
mv clean/.hg work/.hg
cd work
... if necessary, pull, nerge, reconcile - but that would only happen because of a race
hg push

Esto funciona siempre que los repositorios verdaderos, el .hg árboles, son independientes del directorio de trabajo y sus archivos.

Si no son independientes...

 4
Author: Krazy Glew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-30 04:17:50

Nunca he usado Mercurial, pero esto suena mucho a lo que Martin Fowler estaba hablando en su blog no hace mucho tiempo:

Http://martinfowler.com/bliki/MercurialSquashCommit.html

 2
Author: Joseph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-29 14:37:30

¿Por qué no simplemente hg strip --keep comando?

Entonces puedes confirmar todos los cambios como un solo commit.

 0
Author: G. Demecki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-23 09:11:58

HistEdit hará lo que quieras, pero probablemente sea exagerado. Si lo único que necesita es plegar algunos conjuntos de cambios, la extensión Collapse hará el trabajo.

 0
Author: Steve Losh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-30 04:14:25

Supongamos que tienes dos confirmaciones no publicadas THIS y THAT en Mercurial y les gusta que se unan en una confirmación única en THIS punto::

... --> THIS --> ... --> THAT --> ... --> LAST

Comprueba que tus commits no están publicados::

$ hg glog -r "draft() & ($THIS | $THAT)"

Actualización a LAST commit::

$ hg up

E importar commits hasta THIS en MQ::

$ hg qimport $THIS::.

No aplicar todos los parches y aplicar solo primero THIS::

$ hg qpop -a
$ hg qpush
$ hg qapplied
... THIS ...

Unirse con THAT::

$ hg qfold $THATNAME

NOTA Para encontrar el nombre THATNAME use::

$ hg qseries

Aplicar todos los parches y moverlos al historial del repositorio::

$ hg qpush -a
$ hg qfinish -a

Mi entrada de blog sobre el tema es Uniendo dos confirmaciones en Mercurial.

 0
Author: gavenkoa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-10 20:14:05