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

- 2 min read

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?

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.

sponsor

El contenido de este sitio es y será siempre gratuito para todos. Ayudame a mantenerlo así convirtiendote en auspiciador.
Matias Hernández Logo

Tu producto o servicio podría estar aquí

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

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:

bash
					
						$ 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)

bash
					
						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

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

					
				

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

bash
					
						$ git push --all -f
					
				

😃 Thanks for reading!

Did you like the content? Found more content like this by joining to the Newsletter or following me on Twitter

⚙️ Edit this on github