Tip: Ignorar un archivo en git que ya ha sido commiteado antes

Ignorar un archivo en git que ya ha sido commiteado antes

El Problema:

Supongamos que en el repositorio Git de un proyecto tengo 2 archivos con los que siempre he estado trabajando. Por ejemplo, imaginemos que se llamen:

  • novia.js
  • ex-novia.js

Pero de pronto, por alguna razón quiero ignorar el archivo ex-novia.js y entonces agrego este archivo en mi .gitignore para que Git no considere los cambios de ese archivo al hacer un commit.

Sin embargo, por alguna razón edito el archivo ex-novia.js y al hacer un git status sigue indicandome que aún tengo cambios por commitear.

Entonces nos preguntamos ¿Porqué Git no ignora el archivo ex-novia.js a pesar de que ese archivo yá está indicado en el .gitignore?

¿Cómo obligo a Git olvidar por completo ese archivo?

Git aún tiene registrados todos estos archivos en su cache, es por eso que la eliminaremos.

Para lograr esto, entonces ejecutamos:


git rm -r --cached .

Luego agregamos nuevamente todos los archivos que deseamos que Git registre.


git add .

Claro que esta vez ya no se estaría commiteando nuestro archivo ex-novia.js.

Y por último hacemos un git commit.


git commit -m "Ahora mi .gitignore ya ignora normalmente."

Con esto ahora sí el archivo ex-novia.js será ignorado de ahora en adelante.

  • I. Obed Rival H.

    muchas gracias, me sirvió mucho

  • Gabriela Valle

    Hola, tengo una duda y pregunta respecto a este tema que explicas, yo tengo un archivo de configuracion que estan en la rama Develop y cuando cada usuario trabaja localmente en Develop modifica ese archivo para su configuracion local por lo que no es necesario comitearla, entonces lo que hice es agregarlo en el archivo gitgnore y hacer todos esos pasos que mencionas para que git se olvide de ese archivo y no me ofrezca para subirlo al repo, entonces hice estos pasos que mencionas y es correcto como decís, ahora git me ignora ese archivo.
    Pero me me pasó algo, si por ejemplo tengo un bug y agrego/modifico algunos archivos de mi proyecto y tengo que subir esos cambios , entonces los preparo git add y los comiteo, entonces cuando hago un push me va comitear el commit que ignoré, y ademas el commit que hice yo con mis archivos modificados/nuevos, lo que pasó es que me subio ese 1° commit y me borro ese archivo de configuracion en el repo remoto pero me lo dejó en mi repo local, como tendría que hacer para que eso no pase ?, o antes de hacer mi segundo commit tengo que revertir el 1° commit ?, si revierto el 1° commit entonces otra vez estaria en la misma, git me estaria diciendo que mi archivo de configuracion tiene cambios y debo subirlo , pero yo no quiero subirlo. Se entiende lo que pregunto ?, agradeceré ayuda o comentario. Muchas gracias

    • Victor Sandoval

      Hola Gabriela,
      Me parece que lo que intentas hacer es que git ignore tu archivo config pero que no lo borre en el remoto.
      Con respecto a tu pregunta, te comento:

      Digamos que hago un “git status” y tenemos limpia la rama (sin ningún cambio)
      Si tengo un archivo que estuvo como parte del git y ahora lo ignoro. Lo que siempre sucede es que git borra este archivo de su historial y al hacer “git push” no exista en remoto. (Es el proceso normal de git)

      Para solucionar el tema podrías tener dos archivos de configuración, uno que sea:
      – config : Que se use para tus configuraciones de develop.
      – Y otro config.local: Que se use para configuraciones locales.

      De la cual el único archivo que va hacer ignorado es el archivo config.
      Con esto voy a tener que copiar y renombrar manualmente el archivo config.local a config, para que pueda levantar el ambiente en local
      Y en el ambiente de DEVELOP tener un proceso automatizado para que cree ese archivo config con las variables de DEV (Jenkins, Gulp Task).

      Otra solucion podría ser que ignores el config.local y mantengas el config de dev pero cada vez que un nuevo integrante se une al proyecto tendrian que pasarle por algun medio el archivo config.local, ademas deberias configurar en tu proyecto el llamado hacia el config o config.local en base al ambiente en el que estes trabajando.

      Espero se entienda, si tienes alguna duda con eso, no dudes en comentar.