¿Cómo puedo recuperar un archivo eliminado en Mercurial (si lo hago)?

100

Accidentalmente, al usar una GUI en lugar de CLI, eliminé todos los archivos de un proyecto Mercurial.

Me recuperé con Revertir bien y perdí algo de trabajo, que como tengo una máquina del tiempo podría recuperar fácilmente. Pero, ¿hay alguna forma de eliminar o recuperar esos archivos? Buscó en el manual y buscó en Google, pero no puede ver nada. ¿Algún plugin?

Probablemente estoy respondiendo a mi propia pregunta aquí, pero los archivos desaparecieron del directorio y no estaban en la papelera para recuperarlos, por lo que supongo que Eliminar es irrevocable.

ps Lo sé hg forgeto hg remove -Aflo eliminaré sin eliminar del directorio, pero mi pregunta tiene que ver con el error que cometí en lugar de pensar en la acción.

PurplePilot
fuente
1
debería poder verificar una revisión anterior y estar bien (por supuesto, esto solo funciona en caso de que no haya reescrito el historial)
tback
el problema era que me había comprometido, hecho ediciones, R (emocionado). Entonces, después de esa secuencia, sí, obtuve la confirmación 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, luego agregarlos y luego confirmar. Sin embargo, si no hubiera tenido una copia de seguridad, los cambios se habrían perdido.
PurplePilot
1
Pregunta relacionada que le permite buscar solo nombres de archivo (rápido): stackoverflow.com/questions/1013550/…
Michael Pryor

Respuestas:

152

Primero, use hg greppara encontrar el archivo eliminado que desea recuperar. La salida de este comando le mostrará la última revisión para la que estaba presente el archivo 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 ser enviado de nuevo a la cabeza.

BungleFeet
fuente
5
funcionó muy bien para mí, gracias. estaba buscando la respuesta a "¿cómo restablezco un archivo que borré intencionalmente?"
nc.
desde eclipse esto se puede hacer haciendo clic derecho en el archivo Seleccionar equipo -> Revertir
Emil
3
Otra forma de encontrar la revisión que contiene el archivo eshg log -I '**file.ext'
mpen
2
Solo un FYI: desea el número de revisión de la confirmación que aún tiene el archivo, ¡ NO el que lo eliminó!
Lukas Knuth
8

Cita del comentario:

Configuré un repositorio, comprometí todo, eliminé y luego volví a confirmar

Si este es el caso, solo necesita actualizar el directorio de trabajo a la revisión anterior:

$ hg update -C -r-2

Tenga en cuenta el número de revisión negativo. Si los archivos que eliminó no están en la revisión anterior, puede encontrarlos usando:

$ hg log -v
mrucci
fuente
5

Bueno, esto funcionó para mí.

hg revert -r revision pathToTheFile
Shweta
fuente
4

Para Mercurial 1.6 y superior

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

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

Esto le dará la revisión en la que se borrará un archivo llamado NAME.c (en la raíz).

Luego, puede revertir el archivo a la revisión anterior con (como otras respuestas):

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

En su lugar, puede usar un patrón de nombre de archivo para adaptarse a lo que sabe, por ejemplo, puede usarlo **/NAME.cpara buscar en todos los directorios. Puede leerlo en Patrones de nombre de archivo . Y use este enlace para conocer las nuevas especificaciones de revset .

PhoneixS
fuente
1

Una adición a 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 cientos de archivos y lo hice hg addremove, lo que no era mi intención, así que tuve que deshacer todas esas eliminaciones.

¿Usar Buscar archivos eliminados en el historial del repositorio de Mercurial, rápidamente? + xargs + tr, revertir todas las eliminaciones de la revisión -3 a la versión de la revisión -4:

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

Tenga en cuenta que esto fallará si alguno de sus archivos tiene 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á dividida \nen este momento.

keflavich
fuente
0

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

ataylor
fuente
1
No, esto no funciona. Estoy usando una Mac con Mercurial Distributed SCM (versión 1.4.1 + 20091201). Configuré un repositorio, comprometí todo, Eliminé y luego volví a confirmar, pero esto solo devuelve una lista de los archivos marcados como R (emoved) pero en realidad no recupera los archivos. Si marco los archivos como R (emoved) y Rollback antes de confirmar, tampoco pasa nada.
PurplePilot
Una vez que haya realizado la reversión de hg, su repositorio se revertirá, pero su directorio de trabajo actual aún tendrá sus cambios. Simplemente dígale a hg que haga una actualización limpia de la revisión revertida, ahora en la sugerencia: hg up -C.
ataylor
1
hg rollbackno recuperará el archivo eliminado porque la eliminación del archivo no es parte de la transacción de confirmación.
mrucci
4
Así es. Si busca obtener ediciones que no se confirmaron antes de la eliminación, se perderán.
Ataylor
0

Puede eliminar las revisiones comprometidas utilizando el hg stripcomando, que es proporcionado por la extensión mq (Mercurial Queues). Esto debería devolverle sus archivos.

Haga una copia de seguridad antes de intentarlo, porque alterará la base de datos de conjuntos de cambios de Mercurial.

daniel kullmann
fuente
0

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

hg clone mydirectory mydirectory1

y ahora inicia mc (o Far Manager) y compara lo que era con lo que se ha convertido.

cuando esté listo, simplemente elimínelo mydirectory1.

18446744073709551615
fuente
0

Lo siguiente funcionó para mí.

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

(Opcional, para revertir todos los archivos)

hg revert -r <Revision Number> --all
Naveen Kumar V
fuente