2010-03-09 11 views
99

Estoy intentando confirmar solo ciertos archivos con Mercurial. Debido a que hg tiene auto-agregar cada vez que trato de confirmar un cambio, quiere enviar todos los archivos. Pero no quiero eso porque ciertos archivos aún no están "listos".Mercurial (hg) comprometer solo ciertos archivos

Hay

hg commit -I thefile.foo 

pero esto es sólo para un archivo. La mejor manera para mí sería si puedo desactivar el auto-agregado como en Git. es posible?

+5

utilizar la extensión de registro? o puede especificar archivos en la línea de comando 'hg ci foo bar baz' – tonfa

+3

@tonfa, vuelva a publicar su comentario como respuesta – develop7

+0

Por favor, no destroce sus publicaciones. – Glorfindel

Respuesta

133

Puede especificar los archivos en la línea de comandos, como escribe tonfa:

$ hg commit foo.c foo.h dir/ 

Eso sólo funciona y eso es lo que hago todo el tiempo. También puede utilizar la bandera --include que has encontrado, y se puede usar varias veces de esta manera:

$ hg commit -I foo.c -I "**/*.h" 

Usted puede incluso utilizar un fileset para seleccionar los archivos que desea comprometerse:

$ hg commit "set:size(1k - 1MB) and not binary()" 

No hay ninguna configuración que desactive el comportamiento de agregar automáticamente y haga que Mercurial funcione como lo hace Git. Sin embargo, el mq extension podría ser de interés. Eso es una ampliación avanzada, pero que le permite hacer a

$ hg qnew feature-x  # create new patch 
$ hg qrefresh -s foo.c # add a file to the current patch 
$ hg qrefresh -s bar.c # add another file to the patch 
$ hg qfinish -a   # convert applied patches to normal changesets 

que realmente no uso MQ para este propósito mismo, sin embargo, ya que creo que es suficiente con especificar los nombres de archivo en la línea de comandos.

0

Como se sugiere en this Stack Overflow question, la forma más sencilla de hacerlo es con hg shelve.

+1

¿Cómo ayuda la estantería para esto? Entiendo que si deja de usar el cambio de sucursal o cualquier cosa que se queje sobre cambios pendientes, pero para una confirmación selectiva, simplemente seleccione lo que necesita comprometer. – amertkara

+0

Definitivamente no es la forma ** más simple **, pero funciona. Es similar a 'git stash': elimina lo que quieras de tu directorio de trabajo actual, permitiéndote comprometer solo lo que queda. – marcelocra

20

Si desea comprometer algunos archivos y excluir muchos otros, enumere explícitamente los archivos que desea confirmar. -I solo es necesario si desea utilizar patrones en lugar de archivos.

Si desea comprometer muchos archivos y excluir solo algunos archivos, usar -X es más conveniente.

E.g. dado un repositorio que contiene, "file_2" y "file_3", los siguientes son equivalentes, pero el último es más fácil "file_1"/más rápido escribir:

hg commit file_1 file_2 
hg commit -X file_3 
1

A partir de 3.8 también se puede utilizar hg commit --interactive para seleccionar los archivos (antes de 3.8 puede usar crecord extension para funciones similares). El indicador --interactive (o simplemente -i) hará que hg le solicite los archivos que desea incluir en la confirmación. Como una ventaja adicional, puede incluir/excluir fragmentos dentro de los archivos.

Aquí hay un ejemplo de cómo se ve la interfaz. Tenga en cuenta que esta es una captura de pantalla anterior (de crecord en realidad) por lo que la interfaz ha cambiado ligeramente (pero los conceptos básicos son los mismos). crecord screenshot

Nota para obtener esa interfaz necesita habilitar la interfaz de curses.Puede hacerlo por una sola carrera con hg commit --config ui.interface=curses --interactive o, en general, añadiendo el siguiente a su .hgrc:

[ui] 
interface = curses 
Cuestiones relacionadas