Matías Hernández Arellano
Posted on June 27, 2022
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
- Encontrar la ubicación o "path" del archivo dentro del repositorio
- Recorrer cada branch y commit
- 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
$ git filter-repo --path ./web/.env --invert-paths
Después de esta operación puedes actualizar tu repositorio remoto
git push --all -f
✉️ Únete a Micro-bytes 🐦 Sígueme en Twitter ❤️ Apoya mi trabajo
Posted on June 27, 2022
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.