¿Cómo deshacer git rm -rf dirname sin un primer commit?

Yo si:

git init git add . git rm -rf dirname 

Mirando otros posts, git reset --hard HEAD , git checkout -f y git reflog no funcionó, aparentemente porque no hay HEAD para volver, ni un compromiso para recuperar los files.

¿Hay alguna forma de recuperar los files?

No hay forma.

Por lo general, git rm comtesting que los files ya se han confirmado antes de eliminarlos, para que no pierda nada de su trabajo. Sin embargo, el uso de -f anula esta comprobación.

En breve:

  • No use -f .
  • No toques nada que no hayas cometido.

No, hasta donde yo sé. Creo que git desvincula los files, al igual que lo hace rm -rf . No le importa si sabe sobre los files o no, con mucho gusto nukeará el directory. Realmente, tu único recurso es intentar usar una herramienta de recuperación de files como si hubieras hecho rm -rf

Si git no está rastreando el directory dirname , no le permitirá eliminar el directory con git rm -rf ya que no lo conoce. Tendrás (tendrías) un error como

 fatal: pathspec 'dirname' did not match any files 

La única manera que podrías haber eliminado es si hubieras hecho un git add . o git add dirname después del git init . Si ese es el caso, tus files se han ido y no puedes recuperarlos, ya que nunca se ha confirmado y git no los rastrea. Es tan bueno como hacer un rm -rf en una carpeta normal (y no se puede recuperar a less que tenga copys de security)

git reset --hard ayudó mientras la eliminación no se había realizado todavía y, en términos generales, la eliminación se interrumpió con Ctrl+Z

Advertencia : la ejecución de git prune sin la opción -n (1) borrará los datos inalcanzables.

Puede haber una manera, usando git prune y git cat-file .

La ejecución de git prune -n mostrará una list de los objects que se eliminarán al podar:

 $ git prune -n 9cc84ea9b4d95453215d0c26489d6a78694e0bc6 blob c315143703752ef4d11ca7d93f2c324872b2ebff blob 

Cada línea corresponde a un file eliminado.

Ahora, usando git cat-file , podemos restaurar el contenido del file eliminado a un nuevo file:

 git cat-file -p 9cc84ea9b4d95453215d0c26489d6a78694e0bc6 > restnetworking-filename.whatever 

(1) De los documentos de git prune prune:

NOMBRE
git-prune – Pode todos los objects inalcanzables de la database de objects

OPCIONES
-norte
–dry-run
No elimines nada; solo informa lo que eliminaría.

Intereting Posts