Pregunta

Say, he hecho muchos cambios en mi código y sólo necesito a cometer algunos de esos cambios. ¿Hay una manera de hacerlo en mercurial? Yo sé que darcs tiene una función como ésta.

hg transplant puede hacer esto entre las ramas, pero necesito algo como esto por la comisión de código en el presente sucursal y no al añadir conjuntos de cambios de alguna otra rama.

¿Fue útil?

Solución

MQ como Chad menciona son una forma. También hay soluciones más ligeras:

  • extensión Record que funciona más o menos la misma forma que darcs registro. Se distribuye con mercurio.
  • Shelve extensión que le permite "dejar de lado" ciertos cambios, lo que le permite comprometerse sólo un subconjunto de los cambios (los que no son dejados de lado)

Otros consejos

Si está utilizando TortoiseHg 1.x para Windows, esta característica se implementa bien la derecha fuera de la caja (sin extensiones requeridas).

  1. Ejecutar el TortoiseHg Commit herramienta.
  2. Elija un archivo para el que sólo se querer cometer un subconjunto de su cambios.
  3. Haga clic en el trozo pestaña de selección en el panel de vista previa.
  4. Haga doble clic o utilizar la barra espaciadora para de palanca, que cambian trozos deben ser incluir en la confirmación.

TortoiseHg 2.x , en la pestaña del trozo de selección se ha ido. En su lugar, es el Shelve herramienta . Tiene algunas características más que la selección trozo de edad. Estas nuevas características vienen a costa de cierta complejidad añadida.

introducir descripción de la imagen aquí

Tenga en cuenta que no hay necesidad de activar de forma explícita la extensión Mercurial deja de lado al utilizar esta función. De acuerdo con Steve Borho (plomo TortoiseHg desarrollador) en a una pregunta diferente TortoiseHg : "Tenemos una copia local de la extensión deja de lado y poner en ella directamente."


En TortoiseHg 2,7 + , esta funcionalidad se ha mejorado y se reintroducen. En la actualidad se construye directamente en la herramienta Commit:

ejemplo de selección cambio en la herramienta de cometer

Observe en la lista de archivos en el que el archivo de la parte superior izquierda está marcada para indicar que será incluido, el segundo archivo no está marcada, ya que no será incluido, y el tercer archivo, ejemplo.txt, está lleno (el nulo indicador casilla de verificación) ya que solo seleccione los cambios de ese archivo se incluye en la confirmación.

El cambio a ejemplo.txt que será incluido se comprueba en la parte de selección de cambio inferior derecha de la imagen. El cambio que será excluido no está marcada y la vista diff está en gris. Observe también que el icono de la herramienta deja de lado es todavía fácilmente disponible.

El tutorial Colas de Mercurial es terrible para este caso de uso. Todos los ejemplos que he visto suponer que todavía tiene que hacer un commit y que se actualice un solo parche. La mayoría de las veces esto no es el caso, y usted tiene 2 o 3 confirmaciones que desea aplastar juntos o cambiar de alguna otra manera.

Digamos que tiene este tipo de historia:

---O---O---A---B---C

El primer ejemplo es de calabaza comete A, B, y C. En primer lugar init mq:

$ hg qinit

Ahora necesitamos "importar" las confirmaciones A, B y C en la cola de parche. Vamos a suponer que son los últimos 3 confirmaciones. Podemos utilizar la sintaxis "N" revisión de importarlos de esta manera:

$ hg qimport -r -3:-1

Esto significa que la importación como parches de 3 parches de nuevo hasta la última confirmación. Puede comprobar el estado de estos parches con hg qseries. Se debería mostrar algo como esto:

$ hg qseries
101.diff
102.diff
103.diff

donde los números 101, 102 y 103 corresponden a los números de revisión locales de los commit A, B y C. ahora estos parches están aplicados , que significa que los cambios que se describen están ya en el copia de trabajo. Usted puede deshacerse de los cambios en la copia de trabajo y eliminarlos de la historia de confirmaciones, guardándolos en única forma de parche, mediante el uso de hg qpop. Usted puede decir hg qpop; hg qpop al pop cambia C y B de la pila, o especificar un parche para "pop a". En este caso, sería algo como esto:

$ hg qpop 101.diff
now at: 101.diff

Ahora tiene los parches para las confirmaciones B y C en la cola de parche, pero no se aplican (los cambios se han "perdido" - que sólo existen en el área de cola de parche). Ahora se puede doblar estos parches en el último, es decir, creamos un nuevo compromiso que es el equivalente a la suma de los cambios de A + B + C.

$ hg qfold -e 102.diff 103.diff

Esto mostrará su editor para que pueda cambiar el mensaje de confirmación. Por defecto, el mensaje será la concatenación de los mensajes de confirmación para los cambios A, B y C, separadas por asteriscos. Lo bueno aquí es que se hg qfold tabuladores completar los parches si está utilizando bash y tiene la secuencia de comandos hg-finalización de origen. Esto deja a la historia como esta, en la que A + B + C es una única confirmación de que es la combinación de los 3 parches que nos interesan:

---O---O---A+B+C

Otro caso de uso es si tenemos el mismo tipo de historia como antes, pero queremos dejar parche B y fusionar A + C. Esto es bastante similar a la anterior realidad. Cuando se llega a la etapa de qfold, sólo tendría que doblar por la última confirmación en lugar de los 2 últimos se compromete:

$ hg qfold -e 103.diff

Esto deja el cambio para B en la cola de parches, pero no se aplica a la copia de trabajo y su compromiso no está en la historia. Se puede ver esto ejecutando:

$ hg qunapplied
102.diff

La historia ahora se ve así, en la que A + C es una única confirmación que combina cambios A y C:

---O---O---A+C

Un caso de uso final podría ser que es necesario aplicar solamente cometer C. Se podría hacer esto mediante la ejecución del qimport que el anterior, y que podría estallar de todos los parches que no quería:

$ hg qpop -a

Los medios bandera -a sobresalen de todos los parches. Ahora puede aplicar simplemente el que usted desea:

$ hg qpush 103.diff

Esto le deja con esta historia:

---O---O---C

Una vez que haya terminado con todo esto, es necesario acabar con el trasteo cola. Esto se puede hacer con:

$ hg qfinish -a

Así que ahí estamos. Ahora puede ejecutar hg push y sólo cometer exactamente lo que quiere, o hg email un parche coherente a la lista de correo.

Siento que me falta algo porque nadie ha sugerido que esto ya.

El normal "hg commit" comando se puede utilizar para elegir selectivamente qué cometen (que no tiene que confirmar todos los cambios pendientes en el directorio de trabajo local).

Si usted tiene un conjunto de cambios, así:

M ext-web/docroot/WEB-INF/liferay-display.xml
M ext-web/docroot/WEB-INF/liferay-portlet-ext.xml
M ext-web/docroot/WEB-INF/portlet-ext.xml

Puede comprometerse sólo dos de esos cambios con el ...

hg commit -m "partial commit of working dir changes" ext-web/docroot/WEB-INF/liferay-display.xml ext-web/docroot/WEB-INF/liferay-portlet-ext.xml

No es muy conveniente desde la línea de comandos porque hay que escribir a mano los archivos de cometer selectivamente (vs una GUI proceso de facturación caja como la tortuga) pero es casi tan sencillo como se pone y no requiere extensiones. Y el archivo-globbing probablemente puede ayudar a reducir la tipificación (como lo haría anterior, ambos archivos comprometidos comparten de forma única "liferay" en sus nombres de ruta.

Puede utilizar el extensiones de grabación , que se distribuye con Mercurial.

Es necesario activarlo en su ~/.hgrc archivo en primer lugar, mediante la adición a la sección [extensions]:

[extensions]
record=

A continuación, sólo tiene que escribir hg record en lugar de hg commit, y usted será capaz de seleccionar qué cambios a los archivos que desea comprometerse.

También puede utilizar el crecord extensión que proporciona una interfaz más agradable para revisar y seleccionar los cambios. (No se distribuye con Mercurial, sin embargo, y lo he visto ocasionalmente desordenar una confirmación así que no es completamente libre de errores.)

Ya ha pasado algún tiempo. Parece la mejor opción ahora es hg commit --interactive

Colas de Mercurial cumple este papel de Mercurial. Hay un muy buen tutorial vinculado allí.

Trate qct (Qt Commit Tool). Tiene una función de "seleccionar cambios" que se pone en marcha una herramienta de combinación de 3 vías para deshacer los cambios individuales. Después de comprometerse, esos cambios se "deshizo" regresan.

utilizo cometer-patch . Es un guión que le permite editar el diff antes de comprometerse. Es muy agradable con el modo de diff-vc-y el modo de Emacs.

En el pasado solía crecord, pero tiene errores relacionados con Unicode (en realidad la extensión de registro tiene los insectos, que depende de crecord).

En primer lugar hay que olvidar todo lo que sabía acerca de GUI y volver a la línea de comandos. A continuación de la línea de comandos hacer esto:

stat hg> filelist.txt

Este tuberías de todo tipo de archivos modificados en un archivo de texto llamado filelist.txt

A continuación editar su lista de archivos para incluir sólo los archivos que desea comprometerse.

Finalmente comprometerse con el sytnax conjunto de archivos:

hg commit "set: 'listfile: test.txt'"

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