How to recover a file deleted by SVN if you use Eclipse

If you arrived until here, maybe you have lost a file and you want to recover it, so summon up your patience (and get lucky).

Some days ago I was so happy working with Eclipse writing PHP code when I thought: «This is the moment to commit my work». And I did it.

Usually, making a commit makes your SVN to manage the files, synchronicing the modified ones, and storing the new changes in a secure place. But when more than one person is working on the same file, you have a lot of chances your SVN to become crazy getting in troubles. I lost almost the whole work of this day 🙁

Searching on internet (I can’t remember where) Thanks to Dani Bru and his invaluable help, he found the name of a magic directory where were supposed to rest an automatic set of backups. «Yes… of course!» I thought. I had no hope, but this was the only track to solve the problem, and we get to work.

Apparently, in some obscure and hidden place of your file system, Eclipse makes (at least one) a backup before a commit. And this is how we find the place:

First step

Open your terminal and write:

pedro@pedro-laptop:~$ updatedb

Be patient, this can take a while. Specially if you never did it before. The command updates the file system index, so we can get an accurate search in the next step. When it finalizes, you won’t get any output, just will return to the console.

Second step

Search the string org.eclipse.core.resources, which is the magic directory that can save our lifes (well, our day):

pedro@pedro-laptop:~$ locate org.eclipse.core.resources | grep history
/some/path/to/org.eclipse.core.resources/.history/24/109601fa0cd800101a3dcfaf52c523eb
/some/path/to/org.eclipse.core.resources/.history/24/e077e68009d7001017b898f7b25b1cbb
/some/path/to/org.eclipse.core.resources/.history/25/9095cb8d2bd7001017b898f7b25b1cbb
/some/path/to/org.eclipse.core.resources/.history/26/40fa905e2bd7001017b898f7b25b1cbb
/some/path/to/org.eclipse.core.resources/.history/27/80aeb1582bd7001017b898f7b25b1cbb
/some/path/to/org.eclipse.core.resources/.history/2a/20efb2cb11d800101a3dcfaf52c523eb
/some/path/to/org.eclipse.core.resources/.history/2a/80914b200ed800101a3dcfaf52c523eb
/some/path/to/org.eclipse.core.resources/.history/2d/f0acb5240fd800101a3dcfaf52c523eb
/some/path/to/org.eclipse.core.resources/.history/3/e060608410d800101a3dcfaf52c523eb
/some/path/to/org.eclipse.core.resources/.history/32/a0a33f8f0ad80010160af0d88658fae4
/some/path/to/org.eclipse.core.resources/.history/34/60374f474bd60010182b9a1ddb7c2773
/some/path/to/org.eclipse.core.resources/.history/34/c04a901b4ad60010182b9a1ddb7c2773
/some/path/to/org.eclipse.core.resources/.history/36/c0d19b430bd80010160af0d88658fae4
(…)

Third step

Go into the directory relative to your project. Specifically into the .history hidden directory. In this example I will search something about an android project:

pedro@pedro-laptop:~$ cd /home/pedro/workspace/android/.metadata/.plugins/org.eclipse.core.resources/.history/
pedro@pedro-laptop:~$ ls
0 13 1c 2 24 28 2f 33 38 41 48 4e 52 60 6a 71 7a 7f 84 88 9 9b a3 a9 af b2 b6 be c2 c7 ce da e6 ec f f3 fd 1 16 1d 20 25 2a 3 34 3a 43 49 5 57 61 6e 72 7b 8 85 89 91 9d a4 ab b b3 b7 c c3 c8 d2 db e7 ed f0 f7 10 17 1e 22 26 2b 30 36 3c 44 4a 50 59 63 6f 75 7d 81 86 8a 94 9f a5 ad b0 b4 b8 c0 c5 ca d7 e2 e8 ee f1 f9 12 18 1f 23 27 2d 32 37 3d 45 4c 51 5f 64 7 77 7e 83 87 8d 97 a0 a8 ae b1 b5 b9 c1 c6 cd d9 e3 ea ef f2 fc

Fourth step

Launching a ls, we will get a lot of directory names without any apparent sorting (I couldn’t figure at least). But we can sort them by date with this command:

pedro@pedro-laptop:~$ ls -tlahr

This command will show the directories from older to newest (oldest at top of the list, and newest in the bottom). The only thing we can do at this point is look into these directories, starting by the newest one. Maybe some directories are empty, in this case go to the previous one. Being lucky, you will find some directory containing some strange files named like a MD5 hash. Open them and check if they are what you are looking for:

pedro@pedro-laptop:~$ cd e2
pedro@pedro-laptop:~$ ls -lah
total 20K
drwxr−xr−x   2 pedro pedro 4.0K 2011-09-06 00:30 .
drwxr−xr−x 147 pedro pedro 4.0K 2011-09-06 00:54 ..
−rw−r−−r−−   1 pedro pedro 1.9K 2011-09-06 00:27 1036c7a60ed800101a3dcfaf52c523eb
−rw−r−−r−−   1 pedro pedro  824 2011-09-04 21:14 108c03632ad7001017b898f7b25b1cbb
−rw−r−−r−−   1 pedro pedro 1.3K 2011-09-04 21:25 505f6baf2bd7001017b898f7b25b1cbb

pedro@pedro-laptop:~$ gedit * &

If the force is with you, is possible to find your missing files. I got the force with me and I restored the work of my day! 😀

Luck & thanks to Dani who helped me making this story have a happy end!

How to create a mountpoint trough SSH

For console addicted, accessing trough SSH to a server is a really common task. Under my point of view, usually console text editors like vi or nano are not the best option to work with a lot of files at the same time like we can do with any other graphic text editors.
So, I decided to make an internet search to try to find an application able to mount a SSH connection like a standard file system. The application is called sshfs, they didn’t think a lot to get the name 😛
In order to install it, if you use ubuntu, just click on sshfs or write the command below in a terminal:
pedro@pedro-laptop:~$ sudo apt-get install sshfs
Once installed, you only need this command to get it work:
pedro@pedro-laptop:~$ sshfs user@server.com:/my/directory /media/ssh
Where:
  • user, is the name of the SSH user,
  • server.com:, is the name of the server (colon is required)
  • /my/directory, is the remote directory you want to mount, and
  • /media/ssh, is the local directory where the mountpoint will be placed
That’s all, you can now open the directory /media/ssh like any other local directory and open files with your favourite text editor 🙂

Cómo recuperar un archivo eliminado por SVN si usas Eclipse

Si has llegado hasta este post, es más que probable que hayas sufrido la pérdida de un archivo y quieras recuperarlo, así que ármate de paciencia (y suerte).

El otro día estaba yo tan alegre trabajando con mi Eclipse escribiendo en PHP cuando pensé: «Ahora es el momento de hacer un Commit». Así que lo hice.

Lo normal es que al hacer un Commit, el SVN gestione los archivos correctamente y todo se sincronice sin problemas ni conflictos con los ficheros modificados y acabe almacenándose como una modificación válida en un lugar seguro. Pero claro, cuando más de una persona toca el mismo fichero, es más que probable que eso empiece a dar problemas. Yo, perdí prácticamente todo el día de trabajo 🙁

Investigando por internet (no sé exactamente dónde) Gracias a la inestimable ayuda de Dani Bru, que encontró por internet el nombre de un directorio mágico donde se guardan backups automáticos, nos pusimos manos a la obra. Yo pensé, «ya… claro!» No tenía ninguna esperanza, pero era la única pista que tenía para ecuperar lo que se había perdido y estos son los pasos que dí para poder recuperarlo.

Por lo visto, además de la copia remota que se genera al hacer un Commit, en algún lugar oculto de la estructura de directorios que crea Eclipse en local (directorios ocultos y demás cosas), va guardando copias de (al menos) el estado anterior al Commit.

Primer paso

Abrimos el terminal y escribimos:

pedro@pedro-laptop:~$ updatedb

Es posible que tarde algunos segundos, especialmente si nunca antes lo habías ejecutado. Este comando actualiza el índice de directorios del sistema. De manera que en el siguiente paso nos permitirá realizar una búsqueda de manera más precisa. Cuando acabe el comando, no dará ningún mensaje, tan solo nos devolverá el control del terminal.

Segundo paso

Realizamos la búsqueda de la cadena org.eclipse.core.resources, que al parecer es el directorio mágico que puede salvarnos la vida (bueno, el día).

pedro@pedro-laptop:~$ locate org.eclipse.core.resources | grep history
/some/path/to/org.eclipse.core.resources/.history/24/109601fa0cd800101a3dcfaf52c523eb
/some/path/to/org.eclipse.core.resources/.history/24/e077e68009d7001017b898f7b25b1cbb
/some/path/to/org.eclipse.core.resources/.history/25/9095cb8d2bd7001017b898f7b25b1cbb
/some/path/to/org.eclipse.core.resources/.history/26/40fa905e2bd7001017b898f7b25b1cbb
/some/path/to/org.eclipse.core.resources/.history/27/80aeb1582bd7001017b898f7b25b1cbb
/some/path/to/org.eclipse.core.resources/.history/2a/20efb2cb11d800101a3dcfaf52c523eb
/some/path/to/org.eclipse.core.resources/.history/2a/80914b200ed800101a3dcfaf52c523eb
/some/path/to/org.eclipse.core.resources/.history/2d/f0acb5240fd800101a3dcfaf52c523eb
/some/path/to/org.eclipse.core.resources/.history/3/e060608410d800101a3dcfaf52c523eb
/some/path/to/org.eclipse.core.resources/.history/32/a0a33f8f0ad80010160af0d88658fae4
/some/path/to/org.eclipse.core.resources/.history/34/60374f474bd60010182b9a1ddb7c2773
/some/path/to/org.eclipse.core.resources/.history/34/c04a901b4ad60010182b9a1ddb7c2773
/some/path/to/org.eclipse.core.resources/.history/36/c0d19b430bd80010160af0d88658fae4
(…)

Tercer paso

Entramos en el directorio que haga referencia al proyecto que queremos recuperar información. Más concretamente en el directorio oculto .history. Yo en este ejemplo, buscaré algo del directorio android, en el que estoy trabando:

pedro@pedro-laptop:~$ cd /home/pedro/workspace/android/.metadata/.plugins/org.eclipse.core.resources/.history/
pedro@pedro-laptop:~$ ls
0 13 1c 2 24 28 2f 33 38 41 48 4e 52 60 6a 71 7a 7f 84 88 9 9b a3 a9 af b2 b6 be c2 c7 ce da e6 ec f f3 fd 1 16 1d 20 25 2a 3 34 3a 43 49 5 57 61 6e 72 7b 8 85 89 91 9d a4 ab b b3 b7 c c3 c8 d2 db e7 ed f0 f7 10 17 1e 22 26 2b 30 36 3c 44 4a 50 59 63 6f 75 7d 81 86 8a 94 9f a5 ad b0 b4 b8 c0 c5 ca d7 e2 e8 ee f1 f9 12 18 1f 23 27 2d 32 37 3d 45 4c 51 5f 64 7 77 7e 83 87 8d 97 a0 a8 ae b1 b5 b9 c1 c6 cd d9 e3 ea ef f2 fc

Cuarto paso

Al hacer ls, veremos un montón de directorios con nombres de dos caracteres, sin ningún tipo de orden aparente. Al menos, yo no se lo encontré, pero podemos ordenarlos por fecha de modificación con el siguiente comando:

pedro@pedro-laptop:~$ ls -tlahr

Ese comando listará los directorios de más antiguo a más actual. Por lo tanto, sólo deberemos revisar el contenido de los directorios de el más nuevo al más antiguo (de abajo a arriba). Es posible que algunos estén vacíos, pero otros contendrán archivos con nombres que parecen un hash MD5. La única manera de saber el contenido de estos ficheros es editándolos. Veamos cómo:

pedro@pedro-laptop:~$ cd e2
pedro@pedro-laptop:~$ ls -lah
total 20K
drwxr−xr−x   2 pedro pedro 4.0K 2011-09-06 00:30 .
drwxr−xr−x 147 pedro pedro 4.0K 2011-09-06 00:54 ..
−rw−r−−r−−   1 pedro pedro 1.9K 2011-09-06 00:27 1036c7a60ed800101a3dcfaf52c523eb
−rw−r−−r−−   1 pedro pedro  824 2011-09-04 21:14 108c03632ad7001017b898f7b25b1cbb
−rw−r−−r−−   1 pedro pedro 1.3K 2011-09-04 21:25 505f6baf2bd7001017b898f7b25b1cbb

pedro@pedro-laptop:~$ gedit * &

Ahora sólo queda examinar los ficheros para comprobar si este es el directorio que contiene los ficheros que hemos perdido. Si este no es, prueba con el anterior de la lista.

Si tienes algo de suerte, es posible que encuentres lo que necesitas. Yo la tuve y recuperé el trabajo del día. 😀

Suerte y gracias a Dani que hizo que la historia tuviera un final feliz!