jueves, 25 de septiembre de 2014

Recuperar archivos git rm -f sin commit previo

Estaba registrando los cambios de un proyecto y por error borre un archivo con el siguiente procedimiento

Cree un archivo y lo agregué al git local
echo "Archivo nuevo sin subir" > archivoNuevo
git add archivoNuevo
Me di cuenta que no tenía que subirlo aún, entonces trate de quitarlo de mi git local
git rm -f archivoNuevo
Y me di cuenta que borre el archivo físico, no era mi intención, solo quería eliminarlo del git local.

git fsck

Cuando se agrega un archivo a git, el genera un objeto dentro de su estructura
ls .git/objects/
Para recuerar el archivo en este caso se puede utilizar git fsck Luego es navegar por los archivos o carpetas que están registradas en git a partir de los hash

Ejemplo practico

En este caso borre un Controller de Symfony2, y el procedimiento para recuperarlo fue el siguiente: Determinar un sistema de archivos
ubuntu@maquina:~/pathProyecto$ git fsck
Checking object directories: 100% (256/256), done.
Checking objects: 100% (1245/1245), done.
dangling tree c971cfaceab2bc7dee1fe3efcedfffe716eb5f2c
dangling tree ca214170eb5443c9b1b4630d036422eddb89d55b

Navegar entre las carpetas del proyecto con git cat-file muestra el contenido de la carpeta o el contenido del archivo
ubuntu@maquina:~/pathProyecto$ git cat-file -p c971cfaceab2bc7dee1fe3efcedfffe716eb5f2c
100644 blob 90e794c25dcbf24e1c44aba5c0815ef377f0f46e	.gitignore
100644 blob 88a57f8d8da49126c6f7d225d567ad216ace4d83	LICENSE
100644 blob 52c53293dc53ce6321fcd9f4f29779c55165f5ac 	Makefile
100644 blob 7e6f7a622ca9bedf5247e44d3ba166d5a7b65cdc	README.md
100644 blob cad9eeb6320d7d3e3f83492531875c5862391fcd	UPGRADE-2.2.md
100644 blob 504367f2346169e9b4108ac49880c8b009ff96e4	UPGRADE.md
040000 tree 7d121dafbe91256920c0dad3934b03bd77fa11d7  	app
100644 blob 195b186617c9f85af388028a9345153cdce6e6e5	composer.json
100644 blob ae5d37d3e188354d7d4f2b2ff8abf90c8f744abf	index.html
040000 tree d437a977cbaf21a38c2f7e7852bf9f2a1c72d18d	src
040000 tree 533c5122c9dd123d49a685509bfa8953f227c13f    web

ubuntu@maquina:~/pathProyecto$ git cat-file -p d437a977cbaf21a38c2f7e7852bf9f2a1c72d18d
100644 blob 3418e55a68383c1cbc687c52a2994d1e8ed83800	.htaccess
040000 tree f9eec4300591f0193c08a80662b2d1ce907457d2	IDE
040000 tree 0e639844fbee1c0fbe51c1fc20ce1e60d3a7642f	Empresa

ubuntu@maquina:~/pathProyecto$ git cat-file -p 0e639844fbee1c0fbe51c1fc20ce1e60d3a7642f
040000 tree f4b8f9b61516241312f26ab72e92433405063394	ProyectoBundle

ubuntu@maquina:~/pathProyecto$ git cat-file -p f4b8f9b61516241312f26ab72e92433405063394
040000 tree 7c5bb7ca3cd6db5806d3abf454990fd4fe238d37	Controller
040000 tree 5a215c7a5d3e98eaf635c3985c2bfa909e421987	DependencyInjection
040000 tree 13c50e99889ad2e98dfecb42473ee94bb5659a80	Entity
040000 tree cf8daca122047c54cc5da66b2e14d4f2af08472d	Form
040000 tree e7424114972a6861d589b6b6a9b70684d7a89dbf	Librerias
040000 tree 711abb90703eaef547cb0105d098fc34d4731fd7	Resources
040000 tree 080eb9df077fce893369b9a8845d194e12dd9728	Tests
100644 blob b4a35ce62448fa5d5ee1c50cca9e4ef9973e17a6	EmpresaProyectoBundle.php
040000 tree d3d6cd59cc5ece22f39109913de65e030d736043	Twig

ubuntu@maquina:~/pathProyecto$ git cat-file -p 7c5bb7ca3cd6db5806d3abf454990fd4fe238d37
100644 blob 70260f4e9e5235d9a8f820519a078cf4f5656130	DefaultController.php
100644 blob 46b8e004efbff07e5b05be91672702395a37a967	PerdidoController.php
Cuando por llegué a la carpeta donde debería estar hago de nuevo cat-file sobre el hash correspondiente:
ubuntu@maquina:~/pathProyecto$ git cat-file -p 46b8e004efbff07e5b05be91672702395a37a967
<?php

namespace Empresa\ProyectoBundle\Controller;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;



/**
 * Perdido Controller.
 *
 * @Route("/Perdido")
 */
class PerdidoController extends Controller
......


y listo :D archivo recuperado