Git: ¿Cómo eliminar un archivo de la historia?

Git: ¿Cómo eliminar un archivo de la historia?

Git es una herramienta asombrosa, y que ciertamente cambió la forma en que desarrollamos software, y la llegada de Github años atrás cambió la forma en que compartimos nuestros desarrollos.

Pero - siempre hay un pero - al hacer nuestro código fuente público, es fácil caer en ciertos errores o problemas relacionados con información sensible.

¿Cuántas veces has agregado a un commit y subido al repositorio un archivo que se supone no debería ser público?

Para evitar esto existe el archivo .gitignore que te permite configurar que archivos ignorar a la hora de hacer commits

Y si esto te ha pasado, sabes que no sólo sirve eliminar el archivo en un nuevo commit, ya que git almacena todo el historial de tu repositorio, lo que permite el acceso al achivo de igual manera.

Entonces, ¿Cómo eliminas totalmente esta información?

Lo que realmente quieres es, re-escribir la historia de tu repositorio para así eliminar toda referencia a dicho archivo.

Para esto necesitas

  1. Encontrar la ubicación o "path" del archivo dentro del repositorio
  2. Recorrer cada branch y commit
  3. Eliminar el archivo en cada branch

Dependiendo del tamaño de tu repositorio esto puede tomar bastante tiempo.

Supongamos que quieres remover un archivo .env que agregaste por equivocación, y este se encuentra en el directorio web/.env.

En tu terminal, en el directorio root de tu repositorio ejecuta:

$ git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch ./web/.env" HEAD

Al ejecutar esta operaicón verás que en la terminal se mostrará un mensaje indicando que esta herramienta podría traer algunos problemas (hasta ahora no he notado ninguno)

WARNING: git-filter-branch has a glut of gotchas generating mangled history rewrites. Hit Ctrl-C before proceeding to abort, then use an alternative filtering tool such as 'git filter-repo' (https://github.com/newren/git-filter-repo/) instead. See the filter-branch manual page for more details; to squelch this warning, set FILTER_BRANCH_SQUELCH_WARNING=1.

En este mensaje se indica que existe una herramienta alternativa llamada filter-repo que puedes encontrar en github

Una vez instalada (puedes usar brew para macOS o pip) puedes utilizarla con el siguiente comando en tu terminal

Revisa más sobre la instalación

$ git filter-repo --path ./web/.env --invert-paths

Después de esta operación puedes actualizar tu repositorio remoto

git push --all -f %%[buymeacoffee]