Git: detener el seguimiento del archivo después de agregarlo a .gitignore

En este tutorial, veremos cómo detener el seguimiento de un archivo después de agregarlo a .gitignore post-festum, con y sin eliminarlo del repositorio.

¿Olvidó accidentalmente agregar un archivo al archivo .gitignore y comenzó a rastrearlo con otros archivos? ¿O tal vez un repositorio remoto ya tiene un archivo rastreado que ha clonado, pero le gustaría dejar de rastrear?

Tan importante como rastrear los cambios es no rastrearlos en ciertos casos, para que no cambien la escala de lo que estás vigilando. Una vez que se rastrea un relleno, incluso si lo agrega a .gitignore, todavía se rastreará.

En este tutorial, veremos dos formas de cómo detener el seguimiento de un archivo en Git, después de agregarlo a .gitignore.

Elegir entre estos dos depende de si desea que el archivo se mantenga en el repositorio o no.

Detener el seguimiento del archivo y eliminarlo del repositorio {#dejar de rastrear el archivo y eliminarlo del repositorio}

Primero, sigamos adelante y creemos un par de archivos, agréguelos al índice y compártalos en el repositorio:

1
2
3
4
$ touch file.txt
$ touch file2.txt
$ git add .
$ git commit -m "Initial commit"

Ahora se realiza un seguimiento de estos dos archivos, y todos los cambios realizados en ellos son relevantes a los ojos de Git. Aunque... nos hemos olvidado de agregar un archivo .gitignore, y file.txt que no queremos rastrear ya está en el repositorio.

Vamos a crear rápidamente un .gitignore y agreguemos el comparador para file.txt en él:

1
2
3
4
$ touch .gitignore
$ echo "file.txt" >> .gitignore
$ git add .gitignore
$ git commit -m "Adding .gitignore"

Cuando hacemos un nuevo cambio en el archivo:

1
2
$ echo "new line" >> file.txt
$ git status

Aunque ahora está presente en el archivo .gitignore, el archivo aún se está rastreando:

1
2
3
4
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   file.txt

Nos gustaría mantener file.txt presente en nuestro sistema local ("incluye configuraciones importantes", pero dado que las configuraciones son específicas de la máquina, solo se aplica a nosotros). Para hacer que Git deje de rastrear un archivo, mientras lo elimina del repositorio de Git, ejecutaremos el comando git rm:

1
2
$ git rm --cached file.txt
rm 'file.txt'

Nota: El indicador --cached elimina solo los archivos del índice; el directorio de trabajo no se ve afectado en absoluto.

Verifiquemos que el repositorio de Git ya no incluya este archivo, mientras todavía está presente en el árbol de trabajo:

1
2
3
4
5
6
7
$ git ls-files   
file2.txt         
.gitignore

$ ls -a
.       .git        file.txt
..      .gitignore  file2.txt

Detener el seguimiento del archivo sin eliminarlo del repositorio {#detener el seguimiento del archivo sin eliminarlo del repositorio}

Alternativamente, es posible que desee tener el archivo todavía presente en el repositorio, para que otros miembros del equipo puedan descargarlo, pero es una molestia para usted personalmente seguir rastreando los cambios en él, puede dejar de rastrearlo y mantenerlo en el repositorio a través del comando git update-index:

1
2
3
4
$ git update-index --skip-worktree file.txt
$ git status
On branch main
nothing to commit, working tree clean

Este comando actualiza el índice y salta todos los archivos especificados. En nuestro caso, actualiza el índice para omitir file.txt y desactivar el seguimiento. En ese sentido, este comando se puede usar individualmente, por separado del archivo .gitignore.

Nota: Una alternativa es el comando git update-index --assume-unchanged, en el que le dices a Git que confíe en tu palabra de que el archivo no ha cambiado. Esto se hace para archivos grandes que se supone que no deben cambiarse, y es costoso verificar cambios constantemente. Si usa este enfoque, no cambie el archivo, no sea que rompa el uso previsto de la función y Git encuentre errores durante la fusión. Se prefiere usar --skip-worktree.

Verifiquemos que el archivo esté presente tanto en el repositorio como en nuestro sistema de archivos local:

1
2
3
4
5
6
7
8
$ git ls-files
.gitignore
file.txt
file2.txt

$ ls -a
.       .git        file.txt
..      .gitignore  file2.txt
Licensed under CC BY-NC-SA 4.0