¿Por qué ! no conserva un archivo en un directorio ignorado?

Una excepción no surte efecto mientras el directorio padre esté excluido. Revisa esa regla antes de añadir más excepciones.

1. Reconocer el patrón incorrecto

Considera build/keep.txt y build/discard.txt sin seguimiento en la raíz. Estas reglas excluyen build entero: Git no entra a buscar keep.txt. La excepción posterior no puede recuperarlo.

/build/
!/build/keep.txt

2. Ignorar el contenido y conservar un archivo

Sustituye las dos reglas por estas en el .gitignore raíz. Permiten recorrer build, ignoran su contenido inmediato y vuelven a incluir keep.txt. Para excepciones más profundas, todos los directorios padres deben poder recorrerse.

A igual prioridad prevalece la última regla coincidente. Coloca la excepción después de la exclusión y revisa otros patrones y archivos .gitignore anidados.

/build/*
!/build/keep.txt

3. Verificar ambos archivos

Crea los dos archivos y ejecuta los comandos desde la raíz. La salida detallada debe mostrar !/build/keep.txt para keep.txt y /build/* para discard.txt. Una regla con ! indica reinclusión, no exclusión.

git check-ignore -v -- build/keep.txt build/discard.txt

El estado debe mostrar build/keep.txt como no seguido y omitir build/discard.txt. Si ya están seguidos, consulta su artículo: las reglas no cambian el índice.

git status --short --untracked-files=all -- build/

¿Cómo ignorar archivos que Git ya sigue?

Consulta las referencias oficiales para conocer el comportamiento exacto y más detalles: Documentación de Git · Documentación de git check-ignore