Con Mercurial, ¿cómo puedo & # 8220; comprimir & # 8221; ¿Una serie de conjuntos de cambios en uno antes de empujar?

StackOverflow https://stackoverflow.com/questions/1200691

Pregunta

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, comprometo el conjunto de cambios. Al probarlo un poco más, descubro que podría mejorar aún más esta característica ajustando algo en el código. Hago el cambio y me comprometo. 20 minutos después, encuentro que hay un error en esta nueva función, 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 "Implementando la función X", por ejemplo.

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

¿Fue útil?

Solución

¿Qué tal la Collapse Extension ?

Otros consejos

La extensión histedit es exactamente lo que está buscando .

hg histedit -o

o

hg histedit --outgoing

mostrará una lista de los conjuntos de cambios salientes. De la lista puedes

  • Doblar 2 o más conjuntos de cambios creando un solo conjunto de cambios
  • Soltar conjuntos de cambios eliminándolos del historial
  • Reordene los conjuntos de cambios como desee.

histedit le solicitará el nuevo mensaje de confirmación de los conjuntos de cambios plegados, que por defecto es para los dos mensajes con " \ n *** \ n " separándolos.

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

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

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

  1. Crear un parche:

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

  2. Actualización a 99:

    % hg actualización 99

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

    % hg import --no-commit mypatch

  4. Confirma todos los cambios a la vez:

    % hg commit

  5. Ahora tiene dos cabezas (110 y 111) que deberían ser equivalentes en términos de archivos que producen en su directorio de trabajo; tal vez las diferencie antes de quitar las anteriores:

    % hg strip 100

Bien, ahora que lo he explicado todo, parece largo, pero habiéndolo hecho muchas veces, no creo que sea una tarea demasiado pesada ...

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

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

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

Mi método preferido para usar mq para este plegado es usar TortoiseHg como se describe aquí . Sin embargo, se puede hacer fácilmente desde la línea de comando 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 lo sé, ya que generalmente uso TortoiseHg para esa operación).

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

hg collapse y hg histedit son las mejores formas. O, más bien, serían las mejores formas, si funcionaran de manera confiable ... Obtuve histedit para que se bloquee con un volcado de pila en tres minutos. Collapse no es mucho mejor.

Pensé que podría compartir otros dos BKM:

  1. hg rebase --collapse

    Esta extensión se distribuye con Mercurial. No he tenido problemas con eso todavía. Es posible que tengas que jugar algunos juegos para evitar las limitaciones de hg rebase ; básicamente, no le gusta rebasar a un antepasado en la misma rama, con nombre o predeterminado, aunque lo permite si rebase entre (nombre) ramas.

  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 clon y copiar archivos entre ellos. O parches entre ellos. En cambio, 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, los árboles .hg , sean independientes del directorio de trabajo y sus archivos.

Si no son independientes ...

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

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

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

Entonces puede confirmar todos los cambios como una confirmación única.

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

Suponga que tiene dos confirmaciones THIS y THIS inéditas en Mercurial y desea que se unan en una confirmación única en el punto THIS ::

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

Verifique que sus confirmaciones no estén publicadas ::

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

Actualizar a LAST commit ::

$ hg up

e importar confirmaciones hasta THIS en MQ ::

$ hg qimport $THIS::.

Anule la aplicación de todos los parches y aplique solo primero THIS ::

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

Únase con ESO ::

$ hg qfold $THATNAME

NOTA Para buscar el nombre Ese nombre use ::

$ hg qseries

Aplique todos los parches y muévalos al historial del repositorio ::

$ hg qpush -a
$ hg qfinish -a

Mi publicación de blog sobre el tema es Unirse a dos commits en Mercurial .

Sí, strip --keep funciona para la pregunta del autor. Pero fue ligeramente diferente de los demás, por ejemplo, si tiene una versión de 1 a 30 pero solo quiere colapsar la versión 12-15. Otras soluciones funcionan pero no strip --keep .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top