git ready

aprendiendo git de a un commit por vez
por Nick Quaranto, traducido por Matías Flores

ignorar un archivo no lo elimina completamente

publicado el 06 Mar 2009

Una pregunta que veo bastante seguido en el canal #git en Freenode entre los que recién se inician con Git es por qué un archivo no desaparece de la historia del repositorio una vez que lo colocaron en sus archivos .gitignore. La respuesta a esta pregunta es muy simple: cuando le dices a Git que ignore un archivo, lo único que Git hará es dejar de observar cambios en dicho archivo, y nada más que eso. Esto significa que la historia seguirá recordando a este archivo.

Si deseas eliminar un archivo del repositorio, pero mantenerlo en el directorio de trabajo, puedes utilizar la siguiente instrucción:

git rm --cached <file>

Sin embargo, esto también seguirá manteniendo la historia de este archivo. Si realmente deseas eliminarlo de la historia, tienes dos opciones: reescribir todos los commits de tu repositorio, o comenzar de cero. Las dos opciones son horribles, pero por una buena razón: por sobre todas las cosas, Git siempre va a intentar que no pierdas tus datos. Tal como occure con la técnica de rebasing, Git te obliga a pensar detenidamente sobre estas opciones dado que son operaciones destructivas.

Dicho esto, si realmente quieres eliminar un archivo de la historia del repositorio, git filter-branch es la instrucción que estás buscando. Asegúrate de leer detenidamente la documentación antes de utilizarla, ya que literalmente estarás reescribiendo los commits de tu proyecto. Realmente es una gran herramienta para algunas situaciones específicas, y te permite realizar una gran cantidad de cosas, como eliminar completamente los commits de un autor determinado, o mover la raíz del proyecto de un lado a otro. El comando para eliminar un archivo de todas las revisiones es el siguiente:

git filter-branch --index-filter 'git rm --cached <file>' HEAD

Esta acción puede ser útil si necesitas eliminar información confidencial que ha sido introducida por error en el repositorio. En futuros artículos cubriremos algunas otras cosas que podemos hacer con filter-branch. Si conoces algún truco en especial acerca de esta instrucción, escríbenos un comentario o ¡envíanos tu truco!