Eliminar un file del historial de Git sin eliminar el file

Utilicé las instrucciones de GitHub para borrar un file del historial de confirmaciones , pero eliminó el file en cuestión de mi sistema. Esto me sorprendió porque el command git rm --cached sí mismo debería dejar intacto el file. Pero este comportamiento también se puede ver en el ejemplo trabajado en esa página: intente ejecutar ls antes y después del command big git filter-branch ...

Estoy usando Git 2.6.1.

¿Cómo puedo eliminar un file del historial de confirmaciones sin eliminar el file? Obviamente, podría hacer una copy de security (lo cual hice en mi caso), pero eso es una solución y no una solución.

Cuando se realiza git-filter-branch se verifica el nuevo branch branch. Esto actualizará su directory de trabajo a un estado limpio. El file que desea borrado de la historia ha sido borrado. Respaldar de antemano es la solución.

Si olvidó hacer una copy de security, ¡aún puede recuperarlo! Git tarda mucho time en tirar cosas, tus compromisos originales siguen ahí. Después de git-filter-branch habrá una twig llamada original/refs/heads/master (si filtra master) que contiene los commits originales. Puede recuperar el file desde allí.

En general, puede recuperar filters y rebases usando git reflog . Es un logging de cada vez que HEAD cambia (es decir, que finaliza la compra o rebase o fusiona o filtra o …). Por ejemplo, después de hacer el ejemplo del filter Github, git reflog es …

 abaabaf (HEAD -> master, origin/master, origin/HEAD) HEAD@{0}: filter-branch: rewrite 8ef0c30 (refs/original/refs/remotes/origin/master, refs/original/refs/heads/master) HEAD@{1}: clone: 

Puedo usar 8ef0c30 o HEAD@{1} (es decir, la location anterior de HEAD ) o original/refs/remotes/origin/master o original/refs/heads/master para volver a donde estaban las cosas antes de que se ejecutara el filter.

Ante todo:

(Necesita ser dicho.)

Cuando se utiliza git filter-branch , se está reescribiendo el historial de forma automática de acuerdo con su propia especificación (quizás con errores). Por lo tanto , debe hacer una copy de security de su repository antes de hacerlo, de todos modos , o realizar la operación en un nuevo clon separado de su repository.

Por qué el file también desaparece de tu copy de trabajo

git filter-branch aplica el command especificado a cada commit aplicable. Sin embargo, no verifica esas confirmaciones en su copy de trabajo para hacer eso. En cambio, los revisa en .git-rewrite/ de forma pnetworkingeterminada, o en el directory que proporcionó con la opción -d . (Consulte la documentation de git filter-branch , opción -d <directory> ).

Después de haber reescrito los commits aplicables, Git verifica la nueva twig resultante. Como se trata de un cambio de una twig con el file (la versión previa a la reescritura de esa twig) a una sin el file (la versión posterior a la reescritura de esa twig), el file también se elimina de su copy de trabajo.

Cómo puedes conservar el file

Bueno, haz una copy de security.

(Tenga en count que una label o una twig no será una copy de security adecuada si está reescribiendo todas las twigs y todas las tags como se hace en el ejemplo en https://help.github.com/articles/remove-sensitive-data/ . )

Cómo puede recuperar el file si no lo ha hecho

Ver la respuesta de Schwern .