2010-02-01 12 views
91

Accidentalmente, al usar una GUI en lugar de CLI, eliminé todos los archivos en un proyecto de Mercurial.¿Cómo puedo recuperar un archivo eliminado en Mercurial (si es que lo tengo)?

Me recuperé con Revertir bien y perdí algo de trabajo, que como tengo la máquina del tiempo podría volver fácilmente. Pero, ¿hay alguna forma de deshacer/eliminar esos archivos? Arrastre el manual y busque en Google pero no puede ver nada. Cualquier complemento?

Probablemente estoy respondiendo mi propia pregunta aquí, pero los archivos habían desaparecido del directorio y no estaban en la papelera para recuperarlos, así que supongo que Eliminar es irrevocable.

p.s. Sé que hg forget o hg remove -Af se eliminarán sin eliminar del directorio, pero mi pregunta tiene que ver con el error que cometí, en lugar de dejar de pensar en la acción.

+1

que debe ser capaz de pago y envío de una revisión anterior y estar bien (por supuesto, esto sólo funciona en caso de que no se vuelven a escribir la historia) – tback

+0

la el problema era que había cometido, editado, R (eliminado). Entonces, después de esa secuencia, sí, obtuve el compromiso anterior, así que volví a eso y, como tengo una copia de seguridad en forma de máquina del tiempo, pude obtener los últimos cambios y luego agregarlos y luego confirmarlos. Sin embargo, si no hubiera tenido un backuop, los cambios se habrían perdido. – PurplePilot

+1

Pregunta relacionada que le permite buscar solo nombres de archivo (rápido): http://stackoverflow.com/questions/1013550/find-deleted-files-in-mercurial-repository-history-quickly –

Respuesta

141

En primer lugar, utiliza hg grep para encontrar el archivo borrado que desea recuperar. La salida de este comando le mostrará la última revisión para la cual el archivo estuvo presente, y la ruta al archivo eliminado. En segundo lugar, ejecute hg revert -r <revision number> <path to deleted file> El archivo eliminado ahora estará en su copia de trabajo, listo para volver a comprometerse en la cabecera.

+5

funcionó muy bien para mí, gracias. estaba buscando la respuesta a "¿cómo restablezco un archivo que borré intencionalmente?" –

+1

exactamente lo que necesito, gracias. – sa125

+1

muchas gracias, salvó mi día – Emil

0

Puede deshacer la última confirmación en un repositorio con hg rollback. Solo hay un nivel de retrotracción disponible, por lo que si eliminó con más de una confirmación, esto no deshará por completo su cambio. Esto solo funciona en su repositorio local, de modo que si lo ha empujado, no podrá deshacerlo en el repositorio remoto.

+1

No, esto no funciona. Estoy usando una Mac con Mercurial Distributed SCM (versión 1.4.1 + 20091201). Configuré un repositorio, comprometí todo, quité y luego me comprometí de nuevo, pero esto solo trae de vuelta una lista de los archivos marcados como R (emoved) pero en realidad no los devuelve. Si marco los archivos como R (emoved) y Rollback antes de confirmar, tampoco pasa nada. – PurplePilot

+0

Después de que haya realizado la reversión hg, su repositorio se retrotraerá, pero su directorio de trabajo actual todavía tendrá sus cambios. Solo dile a hg que haga una actualización limpia de la revisión retrotraída, ahora en la sugerencia: hg up -C. – ataylor

+1

'hg rollback' no recuperará el archivo eliminado porque la eliminación del archivo no forma parte de la transacción de confirmación. – mrucci

7

Presupuesto de comentario:

me prepara un repositorio, cometió todo, quitan y se comprometió de nuevo

Si este es el caso, entonces sólo tiene que actualizar el directorio de trabajo al revisión anterior:

$ hg update -C -r-2 

Nota el número de revisión negativa. Si los archivos borrados no están en la revisión anterior, se puede encontrar mediante el uso:

$ hg log -v 
0

Puede eliminar las revisiones confirmadas utilizando el comando hg strip, que es provisto por la extensión mq (Colas Mercuriales). Esto debería devolverte tus archivos.

Realice una copia de seguridad antes de probarlo, ya que alterará la base de datos de conjuntos de cambios de Mercurial.

0

El siguiente método es sencillo y tan estúpido que no puede salir mal. Si ha eliminado o cambiado el nombre de varios archivos, estará bien.

hg clone mydirectory mydirectory1 

y ahora empiezas mc (o Far Manager) y comparas lo que era vs lo que se ha convertido.

cuando haya terminado, simplemente elimine mydirectory1.

1

Además de la respuesta aceptada, esto es más rápido si desea deshacer todas las eliminaciones en una confirmación.Eliminé una carpeta grande con unos pocos cientos de archivos e hice hg addremove, que no era mi intención, así que tuve que deshacer todas esas eliminaciones.

Usando Find deleted files in Mercurial repository history, quickly? + xargs + trazas, revertir todos revisión -3 traslado a la versión de revisión -4:

hg log -r -3 --template "{rev}: {file_dels}\n" | tr ' ' '\n' | xargs hg revert -r -4 

Tenga en cuenta que este error si cualquiera de sus archivos tienen espacios en el nombre; http://hgbook.red-bean.com/read/customizing-the-output-of-mercurial.html no parece tener ninguna plantilla donde {file_dels} está dividido por \n en este momento.

4

Para Mercurial 1,6 y por encima de

Si conoce el nombre del archivo borrado puede encontrar su revisión fácilmente con:

hg log -r "removes('NAME.c')" 

esto le dará la revisión en la bruja de un archivo llamado NAME.c (en la raíz) se elimina.

A continuación, puede volver el archivo a la revisión anterior con (al igual que otras respuestas):

hg revert -r <revision number> <path to deleted file> 

Se puede utilizar un patrón de nombre de archivo en lugar de adaptarse a lo que sabe, por ejemplo, puede usar **/NAME.c a buscar en todos los directorios. Puede leer sobre esto en File Name Patters. Y use este enlace para conocer el nuevo revset specifications.

3

Bueno, esto funcionó para mí.

hg revert -r revision pathToTheFile 
0

Lo siguiente funcionó para mí.

hg revert -r <Revision Number> <File Name> 

(opcional, si desea recuperar todos los archivos)

hg revert -r <Revision Number> --all 
Cuestiones relacionadas