Aquí hay una manera de "destrabar" cualquier archivo que de otro modo se ignoraría 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 para git ls-files para que piense que no hay archivos rastreados. El código de shell anterior solicita todos los archivos que se ignorarían si el índice estuviera vacío y luego los elimina del índice real con git rm.
Después de que los archivos hayan sido "no rastreados", use el estado de git para verificar que no se eliminó nada importante (si es así, ajuste sus patrones de exclusión y use git reset - path para restaurar la entrada de índice eliminada). Luego, haga una nueva confirmación que omita el "error".
La "crisis" todavía estará en cualquier compromiso viejo. Puede usar git filter-branch para producir versiones limpias de los commits antiguos si realmente necesita un historial limpio (nb usando git filter-branch "reescribirá el historial", por lo que no debe realizarse a la ligera si tiene algún colaborador que haya retirado cualquiera de sus confirmaciones históricas después de que se introdujo por primera vez la "crisis".
git rm --cached
usar directorios completos con la-r
opción, si eso es útil