¿Puedo restaurar archivos borrados (deshacer un `git clean -fdx`)?

119

Estaba siguiendo las instrucciones para crear páginas de github y olvidé bajar a mi subdirectorio git. Como resultado, acabo de crear un directorio completo de documentos con git clean -fdx.
¿Hay alguna forma de que pueda deshacer este terrible error?

Eric
fuente
2
No lo sé con certeza, pero no creo que sea posible con git. Sin embargo, una utilidad de recuperación para su sistema de archivos podría funcionar.
static_rtti
9
Curiosamente, Git Community Book también sugiere git clean -fdxsin previo aviso que la operación es muy peligrosa. Me pregunto cuántas personas destruyeron irrevocablemente sus archivos con esta sugerencia aparentemente inocente.
catpnosis
5
Asegúrese de verificar si su IDE tiene un "Historial local" como lo hacen los IDE de Eclipse o IntelliJ. Eso puede ahorrarle muchos dolores de cabeza por las git cleanllamadas inadvertidas . Además, trate de dejar el hábito de limpiar sin revisar. Cree un script de Powershell o Bash al que se pueda llamar y que se ejecute git clean -fdxncon un mensaje de confirmación antes de ejecutar la limpieza increíblemente destructiva.
Josh Burgess

Respuestas:

129

No. Esos archivos se han ido.

(Solo se verificó en Linux: git clean callsunlink() , y no hace una copia de seguridad de nada de antemano).

Estera
fuente
32
Si está utilizando un IDE avanzado como RubyMine, Eclipse, etc., lo más probable es que tenga un historial local de archivos eliminados y que pueda recuperarlos.
Usman
1
@Usman en mi caso git cleanhabía eliminado accidentalmente los cambios archivados dentro de la .ideacarpeta oculta y ¡el historial local me salvó!
emkman
2
Gran consejo de @Usman. Con Eclipse, pude recuperar mi archivo con la opción "Restaurar desde el historial local ...": i.imgur.com/XWNLOk5.gifv
brandizzi
1
En realidad, esto es POSIBLE pero con un método hacky. Vea esta respuesta: stackoverflow.com/questions/6267180/can-i-undo-a-git-clean-fdx/…
Just Shadow
4
En PyCharm también puede restaurarlos. Haga clic con el botón derecho en la carpeta que los tenía, haga clic en Historial local, busque la eliminación y haga clic en revertir.
Juanjo Conti
48
git clean -fdxn

Hará un ensayo y le mostrará qué archivos se eliminarían si ejecutara

git clean -fdx

(por supuesto, esto solo es útil si lo sabe con anticipación, pero para la próxima vez)

Peter Ajtai
fuente
7
Para agregar a esto, -nfunciona en la mayoría de los comandos git (y muchos otros comandos * nix).
Nick McCurdy
23

IntelliJ / Android Studio permite restaurar archivos del historial local .

Y2i
fuente
3
¡PyCharm también es compatible con esto! Gracias por esta respuesta. Me alegro mucho de haber leído el resto de las respuestas después de que las 3 principales fueran "no, lamento que no hayas tenido suerte".
Bryson
18

No. "git clean -fdx" eliminará todos los archivos y directorios que git no rastrea desde su directorio de trabajo. Debido a que Git no rastrea estos archivos, no tendrá copias de seguridad de estos archivos. Al menos no habitualmente.

Si ha realizado un 'git add' en uno de estos archivos hace relativamente poco tiempo (pero canceló la confirmación), existe la posibilidad de que pueda encontrarlo con 'git fsck --lost-found'. Vale la pena intentarlo, pero no te hagas ilusiones demasiado.

En el futuro, debería considerar comprometerse varias veces con demasiada frecuencia que pocas veces. De esa manera, al menos tendrá una copia de seguridad local, incluso si no termina enviando estas confirmaciones a un control remoto.

kusma
fuente
El problema real era que se suponía que el directorio no era también un repositorio. Mirando hacia atrás en el registro, resulta que olvidé acceder al nuevo directorio de repositorios después de mkdirleerlo
Eric
1
Poco después de leer esta pregunta, escribí un parche para Git que agrega una variable de configuración para hacer una copia de seguridad de cada archivo eliminado. ¿Quizás podría ser útil para otros? github.com/kusma/git/tree/work/clean-backup
kusma
1
Tuve suerte hoy !!! Gracias a "git fsck --lost-found". Usé lo siguiente para obtener TODOS los cambios: git fsck | awk '{imprimir $ 3}' | xargs git show | tee searchresults.log Como quería el archivo completo que había agregado y luego eliminado, pude obtenerlo del registro. :)
Marcello de Sales
11

Como @kusma mencionó anteriormente, si tiene suerte (si alguna vez hizo "git add"), puede usar lo siguiente para extraer todo el objeto:

git fsck | awk '{print $3}' | xargs git show | tee searchresults.log

De esa manera, buscará todos los tipos de fragmentos, recopilará las diferencias completas y las agregará a un archivo que puede extraer el archivo perdido. En mi caso, había perdido toda una clase de Java.

Marcello de Sales
fuente
8

Si está utilizando cualquier IDE de Jetbrains, hay una opción para ver el historial local de un archivo. En caso de que lo hayas hechogit clean , puede volver a crear el archivo y verificar el historial local del archivo y restaurarlo desde allí.

Me funcionó para un solo archivo. Para un directorio completo, no tengo idea de cómo hacerlo.

Rajesh Paul
fuente
Cree el archivo en la misma ubicación con el mismo nombre de archivo. En IDE, haga clic derecho y haga clic en "Mostrar historial". Copie y pegue el contenido de él. Excelente consejo @Rajesh. Gracias.
profundo
1
Estoy salvado. Gracias.
Scott
No es necesario copiar el contenido del archivo, simplemente haga clic derecho en el archivo y haga clic en 'revertir' para restaurarlo a esa versión (incluso si lo eliminó)
n00b
7

Hoy tuve este problema.

Como han dicho otros, git no guarda los archivos.

La única forma de deshacer esto es con una utilidad de recuperación. Usé "extundelete" y recuperé todo, pero su millaje / sistema de archivos puede variar.

dougallj
fuente
7

Si está trabajando en Eclipse, una de las posibles soluciones es restaurar desde el historial local de Eclipse.

Abhinav
fuente
2
Estoy usando PyCharm y la historia local me salvó
psychok7
1
¡Lo mismo en IntelliJ IDEA!
Arturakay
RubyMine también tiene historia local. ¡me salvó!
Usman
Todos los navegadores IntelliJ tienen un historial local. Agradecidamente. Estaba usando WebStorm y casi tuve un aneurisma antes de encontrar eso. Pasaron 3 días de 12 horas de trabajo, y consideré seriamente beberme una botella de licor fuerte en mi escritorio.
Josh Burgess
7

¡De hecho, ! ¡Esto es posible! Pero sin usar comandos de git.
Todo lo que necesitamos es solo una herramienta de recuperación de archivos como Recuva .
Simplemente mencione la ruta desde donde se eliminó y deje que recupere los archivos.

También aquí hay algunas notas útiles para usar esa aplicación:

  1. Le recomiendo encarecidamente que marque esta casilla de verificación antes de restaurar archivos (cuando los archivos eliminados aparecen en la ventana de recuperación):
    Advanced Mode-> Options-> Actions-> Restore folder structure
    Con esto, todos sus archivos se recuperarán manteniendo la estructura de la carpeta, por lo que será mucho más fácil para simplemente arrastrar y soltar esa carpeta en la ruta desde donde fue eliminada.
  2. Es preferible instalar la herramienta de recuperación en un dispositivo USB (debido a la advertencia a continuación)
  3. Mientras menciona dónde restaurar los archivos, evite elegir la misma unidad desde donde se eliminaron los archivos (nuevamente debido a la advertencia mencionada a continuación), ya que el archivo actualmente recuperado puede sobrescribir el otro archivo eliminado que aún no se ha recuperado. Recuperar archivos en cualquier unidad USB siempre es una buena solución.

¡Advertencia!Tan pronto como pierda (elimine accidentalmente) algún archivo, intente no tocar (agregar / editar archivos) la unidad de donde se eliminó para aumentar la posibilidad de una recuperación exitosa. De lo contrario, podría perder completamente ese archivo.

Por qué funciona: cuando elimina un archivo, en realidad no se elimina. Simplemente está marcado como "eliminado", por lo que la próxima vez que agregue / actualice archivos en la misma unidad, esos archivos antiguos se sobrescribirán con los nuevos. Pero hasta que se sobrescriban, aún es posible leer (y, por supuesto, recuperar) los archivos.

Solo sombra
fuente
1
Gracias me salvaste la vida. No sé si es la respuesta correcta porque no pude recuperar todo, pero tuve suerte porque obtuve los archivos más importantes que necesitaba.
XzaR
2

Lo hice con un código que se suponía que debía agregar a mi repositorio y limpié con -dfx que pude restaurar los archivos.

Traté de usar debugfs, buscar y vincular desde inodos, testdisk y muchas otras herramientas que aparecen y ninguna ha encontrado el directorio que esta estúpida escritura borró por accidente.

Descarga extundelete desde sourceforge.
Probablemente necesite instalar el paquete e2fslibs-dev
Run

$ ./configure 
$ make 

Generará el binario para extundelete dentro de la carpeta src. En mi caso, borré una carpeta por error. vamos a llamarlo FOOBAR

Acabo de correr:

$  sudo ./extundelete --restore-directory <full path to FOOBAR > <the partition> 


y creó una carpeta llamada RESTORED_FOLDERS

motbus
fuente
¡Guauu! aunque esto no recuperó el archivo que quería, es algo de lo que tomaré nota - ¡definitivamente será útil!
vyom
1

Si está usando una mac y tiene una copia de seguridad con un Time Machine, entonces puede restaurar

Anulable
fuente
0

Afortunadamente, cometí este error mientras usaba Windows 7. Fui a la papelera de reciclaje, resalté todos los archivos eliminados y hice clic en "Restaurar". Hecho.

Matt Cashatt
fuente
6
¿Qué quieres decir? git cleanno mueve archivos a la papelera de reciclaje.
MEMark
0

Si no ha introducido sus cambios (git push), también puede recuperar la información de su servidor que aún no está actualizada. Usé filezilla para recuperar los archivos que eliminé y los copié en mis archivos locales. No es la mejor manera de hacerlo, pero funciona y evita usar la consola

Mbotet
fuente