Como reza aquel dicho el ser humano, es el único animal que tropieza tres veces con la misma piedra. En este sentido, no es ni la primera, ni será la última vez que incluyo algún archivo que no debería en un repositorio público. Aunque tengo que decir, que también, lo he hecho en repositorios privados, privados pero compartidos, con lo que el problema sigue siendo el mismo. Sin embargo, en git al contrario que en la vida real, es posible reescribir la historia, y precisamente de eso trata este artículo, de como reescribir la historia de git.
La cuestión es que tener un archivo incluido en un control de versión es un verdadero problema. No basta con que borres ese archivo de la rama master, ni en su caso de otras ramas. Tienes que borrarlo de la historia… Así en este artículo te contaré otra opción para eliminar archivos de git.
Y digo otra opción, porque en su momento ya escribí un artículo sobre como borrar archivos de git. Sin embargo, en ese artículo, te contaba como hacerlo con los medios que git pone al alcance de tu mano. Sin embargo, en este artículo, quiero indicarte una herramienta externa. Y ¿porque utilizar una herramienta externa? Por el simple hecho de que es una herramienta que te va a permitir hacer esta misma operación pero hasta 20 veces mas rápido.
Como reescribir la historia en git
Una tontá o una reflexión…
Cuando estaba escribiendo la introducción, y he mencionado aquello de reescribir la historia en git… me he hecho gracia a mi mismo. Me ha hecho gracia pensar, en que si mas de uno, tuviera esta herramienta para borrar determinados sucesos de la historia, haría verdaderos estragos.
Sin embargo, y como reflexión, que no tiene nada que ver con git, ni el control de versiones, ni ninguna otra razón por la que hayas caído en este artículo, lo sucedido es la razón para que seamos quienes somos. En verdad, ¿tiene sentido borrar u ocultar la historia?, y por supuesto, me refiero, tanto a lo bueno, como a lo malo….
En fin, ahí lo dejo…
Objetivo: no dejar ni rastro o reescribir la historia en git
Así, como contaba, tanto en la introducción, como en el artículo que he mencionado anteriormente, el objetivo de este artículo, es darte otra herramienta con la que borrar o eliminar un archivo de git. O básicamente para reescribir la historia en git, por que al fin y al cabo es lo que vas a hacer. Si, puesto que al eliminar un archivo y todo su rastro del repositorio, no estás haciendo otra cosa que reescribiendo la historia en git.
Pero, ¿porque eliminar archivos de git? Pues las razones son variadas, pero una que seguro que en mas de una ocasión te ha podido suceder, es la de subir usuario y contraseña de acceso a un servicio, una API o lo que consideres. Estos datos, deben permanecer en el anonimato, y nunca subir al repositorio, ya sea este público o privado.
Conforme, ahora ya se porque quiero borrar ese archivo, pero ¿porque es tan difícil eliminar archivos de git? Que hayas eliminado un archivo no quiere decir que no siga en el repositorio. Si, como lo lees. Git es un control de versiones, y que tu lo hayas eliminado de la última versión, simplemente indica, que en esta versión ya no está, pero continua en la versión en la que lo añadiste. Precisamente esa es una de las grandes ventajas de git.
De esta manera, para recuperar ese archivo solo tienes que regresar a esa versión en git y ya tendrás ese dato que querías que permaneciera protegido de miradas ajenas.
Pero, no solo esto, si no que también lo tendrás en otras ramas… Vaya, simplemente tienes que crearte un repositorio y comenzar a hacer pruebas, para darte la cuenta de la situación. Es lo que tiene un sistema de control de versiones, que al fin y al cabo, no es mas que un testigo silencioso de todos nuestros actos…. Silencioso, hasta que le preguntas, claro….
BFG Repo-Cleaner
BFG Repo-Cleaner es una herramienta que te permitirá eliminar archivos de git, por la razón que sea que necesites hacerlo. Se trata de una herramienta que funciona como git-filter-branch, pero entre 20 y 700 veces mas rápida.
Y, BFG Repo-Cleaner, no solo es una herramienta mas rápida que git-filter-branch
, sino que además es mucho mas sencilla de utilizar. Y es mas sencilla de utilizar en tanto en cuanto está desarrollada con el único objetivo de eliminar archivos de git.
Para mi, el único inconveniente de esta herramienta es que necesitas Java para hacerla funcionar. Y, supongo que ya me lo habrás oido decir, o lo habrás leído en alguna que otra ocasión en este sitio, Java consume muchos recursos…
Instalación
Antes de nada, lo primero es instalar la aplicación… bueno, realmente, no es necesario instalar nada, simplemente descargarte el archivo .jar
. En el momento de escribir este artículo, la última versión era la 1.13.0
. Para descargarlo, simplemente ejecuta la siguiente instrucción en un terminal,
wget https://search.maven.org/remotecontent?filepath=com/madgag/bfg/1.13.0/bfg-1.13.0.jar -O bfg.jar
Por supuesto, también necesitarás Java para hacerlo funcionar, tal y como te he comentado anteriormente. Para ello, de nuevo en un terminal,
sudo apt install default-jre
Por comodidad, te puedes crear un alias para ejecutar esta herramienta. Por ejemplo,
alias bfg="java -jar bfg.jar"
A partir de este momento, solo necesitas ejecutar bfg
para empezar a eliminar archivos de tus repositorios, con su historia y todo.
Eliminando archivos de git
¿Como puedo eliminar archivos con esta bfg repo-cleaner? Para eliminar archivos tan solo tienes que ejecutar en el directorio de tu repositorio la siguiente instrucción,
bfg --delete-files <archivo-a-eliminar>
También tiene ontra interesante opción, como es que en lugar de eliminar el archivo, lo que hace es reemplaza su contenido por la palabra **REMOVE**
. Esto lo puedes hacer ejecutando,reescribir la historia en gitTambién tiene ontra interesante opción, como es que en lugar de eliminar el archivo, lo que hace es reemplaza su contenido por la palabra **REMOVE**
. Esto lo puedes hacer ejecutando,
bfg --replace-text <archivo-a-eliminar>
Llegados a este punto hacerte una observación importante, y es que los archivos del último commit
se mantienen intactos. Es decir, no puedes utilizar esta herramienta para borrar o reescribir los archivos del último commit. Esto la ha hecho así su desarrollador, pensando en que lo que tienes en ese último commit es lo que vas a desplegar directamente a producción. Así, si quieres modificarlo tendrás que hacerlo tu directamente.
La especialidad de BFG Repo-Cleaner
Además de ponerte las cosas fáciles a la hora de borrar cualquier rastro de un archivo en un repositorio, BFG-Cleaner está especializado en borrar archivos de gran tamaño de tu repositorio. Lo cierto, es que en ocasiones, te empeñas en subir algún archivo, como puede ser un binario, con el que git, no se relaciona excesivamente bien. Y ¿para que haces el control de versiones de algo que no se puede controlar? Para esto, existen otros sistemas…
Así como te digo, una de las grandes especialidades de esta herramienta es la de borrar archivos de gran tamaño, pero además de forma indiscriminada. Por ejemplo, si quieres borrar todos los archivos con un tamaño superior a 100 megabytes, tan solo tienes que ejecutar,
bfg --strip-blobs-bigger-than 100M
Conclusión
Como ves, se trata de una potente herramienta que te va a permitir reescribir la historia de git, de una forma sencilla, a la vez que potente. Así no te tienes que preocupar por haber subido archivos con credenciales o archivos de gran tamaño. Con esta herramienta los puedes borrar en cualquier momento y reescribir la historia en git, en cualquier momento.
Más información,
Imagen de portada de Free-Photos en Pixabay