Borrando información sensible del historial de modificaciones Git

Es es un post apunte, para borrar ficheros del historial de modificaciones, de un repositorio Git. Esta acción me ha costado un poco encontrarla, así que aquí me hago eco. Se trata de una acción de limpieza del historial, ya que quizá queremos sacar ficheros con información sensible, que no queremos que estén en el historial: configuraciones locales, ficheros con alguna contraseña, ficheros temporales, ficheros de configuración del entorno de desarrollo, ficheros que necesitan compilación en el servidor de instalación, etc..

¡Atención! Esta acción no deja rastro de dichos ficheros, pero luego te deja el historial que no puedes redistribuirlo como si no hubiera pasado nada. Las identificaciones de las cosas habrán cambiado, se habrán reescrito sólo guardando iguales las fechas y autores. Y en terceros repositorios con Git no vas a poder hacer ‘git pull’ como si no hubiera pasado nada. Luego dejo también una solución a esto último.

Al grano, la acción

Tal y como mencionan en la documentación oficial:
https://git-scm.com/docs/git-filter-branch
..este comando queda tal que así:

git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch path_to_file" HEAD

Te pedirá forzar los cambios, entonces forzamos así:

git filter-branch -f --index-filter "git rm -rf --cached --ignore-unmatch path_to_file" HEAD

Lo siguientes será subir forzando las modificaciones:

git push -f

En la sección ejemplos de la página enlazada hay otras opciones.

Resolver conflictos para volver a poder hacer git pull

Si hemos hecho lo anterior en local en un repositorio de Git. Luego podemos hacer un push forzado al repositorio de origen. Entonces, si tenemos un tercer o cuarto clon del repositorio, que por ejemplo se dedica a sólo hacer git pull para despliegues, no va a funcionar.

Entonces he encontrado dos soluciones:

  • Borrar y volver a clonar el tercer repositorio completo.
  • Rehacer la rama que se usa en el tercer repositorio.

Para la segunda opción, suponiendo que el despliegue en un tercer repositorio se hace desde la rama master, se podría arreglar con los siguientes comandos:

git checkout master
git branch mastercopy
git checkout mastercopy
git branch -D master
git pull
git checkout master
git branch -D mastercopy

..si todo ha ido bien, ya podemos continuar con el trabajo en terceros repositorios, después de haber reescrito el historial completo por borrar ficheros que no tenían que estar en Git.

¡Un saludo!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *