¿Descartar todo y obtener una copia limpia de la última revisión?


159

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 quiero confirmar, por lo que tengo cambios locales y archivos que no se agregan al repositorio.

¿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 debería haber una manera más simple.

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 "revertir --todos" o un paso que realiza? Pregunto porque "hg update" solo actualizará los archivos que hayan cambiado. Si elimina otros archivos antes de actualizar, no los recuperará a menos que actualice de nuevo a null-revision ( hg update 00) y luego vuelva a la sugerencia. ¿Por qué no es hg revert --allsuficiente volver a un estado de carpeta de trabajo consistente antes de extraer y actualizar?
Lasse V. Karlsen

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
Puede encontrar el archivecomando útil en el futuro. Por ejemplo, podría hg archive ../newbuild, y una instantánea de su repositorio al final hg updatese colocará allí. Normalmente hago eso para las compilaciones nocturnas solo para no arriesgarme a saturar mi repositorio. Simplemente elimine el directorio de compilación cuando ya no lo necesite.
Tim Post

Respuestas:


212

Esos pasos deberían poder reducirse a:

hg pull
hg update -r MY_BRANCH -C

los -C indicador le dice al comando de actualización que descarte todos los cambios locales antes de actualizar.

Sin embargo, esto podría dejar archivos sin seguimiento en su repositorio. Parece que también quieres deshacerte de ellos, así que usaría la purgeextensión para eso:

hg pull
hg update -r MY_BRANCH -C
hg purge

En cualquier caso, no hay un solo comando que pueda pedirle a Mercurial que realice que haga todo lo que desee aquí, excepto si cambia el proceso a ese método de "clon completo" que dice que no puede hacer.


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

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

18
Si la extensión de purga no está activada, también puede usar el comando de esta manera: hg --config "extensions.purge=" purge --all
Samuel Delisle

55
@ csharptest.net hg purge --allme dio un buen dolor de cabeza, ya que también borró mis configuraciones locales, es decir: usuario / contraseña de la base de datos, etc. :)
VMC

@SamuelDelisle gracias, señor, ¡no quería hacer ningún cambio de configuración solo para este comando único en mi script!
joonas.fi

113
hg up -C

Esto eliminará todos los cambios y se actualizará al último encabezado de la rama actual.

Y puede activar la extensión de purga para poder eliminar todos los archivos no versionados también.


¿Eso incluye archivos sin seguimiento? Tuve algunos problemas con los de otros comandos que estaba intentando. Lo intentaré ahora ...
Rory

77
@Rory: no, hg purgees para archivos no versionados.
zerkms

10

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

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

Que está usando

update -r --rev REV revision

update -C --clean descartar cambios no confirmados (sin copia de seguridad)

status -u --unknown muestra solo archivos desconocidos (no rastreados)

status -n --no-status ocultar prefijo de estado


4

Si buscas un método que sea fácil , puede intentarlo.

Yo mismo apenas puedo recordar las líneas de comandos para todas mis herramientas, por lo que tiendo a hacerlo usando la interfaz de usuario:


1. Primero, seleccione "commit"

Cometer

2. Luego, muestre los archivos ignorados. Si tiene cambios sin confirmar, escóndelos.

Mostrar archivos ignorados

3. Ahora, selecciónelos todos y haga clic en "Eliminar sin versión".

Borra los

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


No estoy seguro (uso yo mismo SourceTree), pero estas capturas de pantalla parecen ser de TortoiseHg Workbench. En general, creo que las soluciones basadas en la interfaz de usuario son útiles, pero esta respuesta necesita un mejor etiquetado. Además, "ocultarlos" me suena un poco vago.
Jon Coombs

3

El estado de hg le mostrará todos los archivos nuevos, y luego podrá simplemente ejecutarlos .

Normalmente quiero deshacerme de los archivos ignorados y no versionados, entonces:

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

Y luego sigue eso con:

hg update -C -r xxxxx

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


Para seguir la tradición de Stack Overflow de decirte que no quieres 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 'hacer limpio' en su proceso de construcción, y tal vez también 'hacer realmente limpio' y 'hacer distclean'.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.