2011-02-10 22 views
132

Estoy moviendo un proceso de compilación para usar mercurial y quiero que el directorio de trabajo vuelva al estado de la revisión de la sugerencia. Las ejecuciones anteriores del proceso de compilación habrán modificado algunos archivos y agregado algunos archivos que no deseo confirmar, por lo que tengo cambios locales y archivos que no se agregan al repositorio.Mercurial: ¿cómo descartar todos los cambios locales, incluidos los archivos no versionados?

¿Cuál es la forma más fácil de descartar todo eso y obtener un directorio de trabajo limpio que tenga la última revisión?

Actualmente estoy haciendo esto:

hg revert --all 
<build command here to delete the contents of the working directory, except the .hg folder.> 
hg pull 
hg update -r MY_BRANCH 

pero parece que no debe haber una manera más sencilla.

Quiero hacer el equivalente a eliminar el repositorio, hacer un clon nuevo y una actualización. Pero el repositorio es demasiado grande para que sea lo suficientemente rápido.

+1

Es "(eliminar el contenido ...)" un comentario al comando "revert --all" o un paso que realice? Lo pregunto porque "hg update" solo actualizará los archivos que cambiaron. Si elimina otros archivos antes de realizar la actualización, no los recuperará a menos que actualice de nuevo a la revisión nula ('hg update 00') y luego haga una copia de seguridad de la sugerencia. ¿Por qué no 'hg revertallall' basta para volver a un estado de carpeta de trabajo consistente antes de tirar y actualizar? –

+0

es un paso separado hecho con mi software de compilación. (Podría haber usado una eliminación de línea de comandos, pero no lo hice). – Rory

+1

Es posible que el comando 'archive' sea útil en el futuro. Por ejemplo, podría 'hg archive ../ newbuild', y una instantánea de su repositorio en la última' hg update' se colocará allí. Normalmente lo hago para construcciones nocturnas solo para no arriesgar el desorden de mi repositorio. Simplemente elimine el directorio de compilación cuando ya no lo necesite. –

Respuesta

172

Esos pasos deben podrá ser acortado a:

hg pull 
hg update -r MY_BRANCH -C 

La bandera -C le dice al comando de actualización para descartar todos los cambios locales antes de actualizar.

Sin embargo, esto aún puede dejar archivos sin seguimiento en su repositorio. Parece que usted quiere deshacerse de esos también, así que podría utilizar la extensión purge para ello:

hg pull 
hg update -r MY_BRANCH -C 
hg purge 

En cualquier caso, no hay uno solo comando que puede pedir Mercurial para llevar a cabo que va a hacer todo usted quiere aquí, excepto si cambia el proceso a ese método de "clonación completa" que dice que no puede hacer.

+5

Gracias, fue la 'purga' que necesitaba. La actualización -C no elimina los archivos no rastreados, que es lo principal con lo que estaba luchando. – Rory

+12

+1 para "hg purge --all" –

+4

Puede usar TortoiseHg para purgar también. Solo tiene que activar la extensión en la configuración del banco de trabajo (o editar mercurial.ini). – Dave

90
hg up -C 

Esto eliminará todos los cambios y se actualizará a la última cabeza en la rama actual.

Y puede activar purge extension para poder eliminar también todos los archivos no versionados.

+0

¿Eso incluye archivos sin seguimiento? Tuve algunos problemas con los de otros comandos que estaba intentando. Voy a intentarlo ahora ... – Rory

+6

@Rory: no, 'hg purge' es para archivos no versionados. – zerkms

9

Para eliminar sin seguimiento en * nix sin la extensión de purga puede utilizar

hg pull 
hg update -r MY_BRANCH -C 
hg status -un|xargs rm 

que está utilizando

actualización -r REV --rev revisión

actualización -C - limpiar descartar cambios no confirmados (sin copia de seguridad)

estado -u --unknown mostrar solo archivos desconocidos (no seguidos)

estado -n --no-estado prefijo estado ocultar

3

Si usted está buscando un método que sea fácil , entonces es posible que desee probar esto.

que para mí casi no puedo recordar líneas de comando para todas mis herramientas, por lo que tienden a hacer que el uso de la interfaz de usuario:


1. En primer lugar, seleccionar "comprometerse"

Commit

2. A continuación, muestre los archivos ignorados. Si tiene cambios no confirmados, escóndalos.

Show ignored files

3. Ahora, seleccione todos ellos y haga clic en "Eliminar No versionado".

Delete them

Listo. Es un procedimiento que es mucho más fácil de recordar que las cosas de línea de comandos.

+0

No estoy seguro (utilizo SourceTree por mi cuenta), pero estas capturas de pantalla parecen ser de TortoiseHg Workbench. En general, creo que las soluciones basadas en UI son útiles, pero esta respuesta necesita un mejor etiquetado. Además, "ocultarlos" suena un poco vago para mí. –

2

hg status le mostrará todos los archivos nuevos, y entonces usted puede simplemente rm ellos.

Normalmente me quieren deshacerse de ficheros ignorados y no versionados, por lo que:

hg status -iu       # to show 
hg status -iun0 | xargs -r0 rm   # to destroy 

Y entonces sigue este con:

hg update -C -r xxxxx 

que pone todos los archivos versionados en el estado correcto para su revisión xxxx


Para seguir la tradición del desbordamiento de pila de decirle que no tiene w Para hacer esto, a menudo encuentro que esta "Opción Nuclear" ha destruido cosas que me importan.

La forma correcta de hacerlo es tener una opción 'make clean' en su proceso de compilación, y tal vez un 'make reallyclean' y 'make distclean' también.

Cuestiones relacionadas