Aplicar .gitignore en un repositorio existente que ya está rastreando un gran número de archivos

Tengo un proyecto de Visual Studio en mi repositorio. Recientemente añadí un archivo .gitignore bajo mi proyecto y asumo que eso le dice a Git que ignore los archivos listados en el archivo.

Mi problema es que todos esos archivos ya están siendo rastreados y, por lo que sé, Git no ignorará un archivo que ya fue rastreado antes de que se añadiera una regla a este archivo para ignorarlo.

Se sugirió usar git rm --cached y quitarles el seguimiento manualmente, pero eso me va a llevar una eternidad para revisarlos uno por uno.

He pensado en borrar el repositorio y volver a crearlo pero esta vez con el archivo .gitignore presente, pero debe haber una forma mejor de hacerlo.

Solución

Esta respuesta resolvió mi problema:

En primer lugar, comite todos los cambios pendientes.

Luego ejecute este comando:

git rm -r --cached .

Esto elimina todo del índice, y luego sólo ejecuta:

git add .

Confirmarlo:

git commit -m ".gitignore is now working"
Comentarios (9)

Como se especifica aquí Puede actualizar el índice:

git update-index --assume-unchanged /path/to/file

Al hacer esto, los archivos no aparecerán en git status o git diff.

Para empezar a rastrear los archivos de nuevo puedes ejecutar

git update-index --no-assume-unchanged /path/to/file
Comentarios (3)

Esta es una manera de "desobstruir" los archivos que de otra manera serían ignorados bajo el conjunto actual de patrones de exclusión:

(GIT_INDEX_FILE=some-non-existent-file \
git ls-files --exclude-standard --others --directory --ignored -z) |
xargs -0 git rm --cached -r --ignore-unmatch --

Esto deja los archivos en su directorio de trabajo pero los elimina del índice.

El truco utilizado aquí es proporcionar un archivo de índice inexistente a git ls-files para que piense que no hay archivos rastreados. El código del shell de arriba pide todos los archivos que serían ignorados si el índice estuviera vacío y luego los elimina del índice real con git rm.

Después de que los archivos hayan sido "desrastreados", utiliza git status para verificar que no se ha eliminado nada importante (si es así, ajusta tus patrones de exclusión y utiliza git reset -- path para restaurar la entrada del índice eliminada). A continuación, haz un nuevo commit que elimine la "basura".

La "basura" seguirá estando en los commits antiguos. Puedes usar git filter-branch para producir versiones limpias de los commits antiguos si realmente necesitas un historial limpio (n.b. usar git filter-branch "reescribirá la historia", por lo que no debería llevarse a cabo a la ligera si tienes algún colaborador que haya sacado alguno de tus commits históricos después de que se introdujera la "crudeza").

Comentarios (1)