DEV Community

Cover image for Git: ¿Cómo eliminar un archivo de la historia?
Matías Hernández Arellano
Matías Hernández Arellano

Posted on • Originally published at matiashernandez.dev

5 1

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
Footer Social Card.jpg
✉️ Únete a Micro-bytes 🐦 Sígueme en Twitter ❤️ Apoya mi trabajo

AWS Q Developer image

Your AI Code Assistant

Automate your code reviews. Catch bugs before your coworkers. Fix security issues in your code. Built to handle large projects, Amazon Q Developer works alongside you from idea to production code.

Get started free in your IDE

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay