bang parece no excluir files en .gitignore

Tengo un directory foo que contiene 2 files, bar y baz . Tengo el siguiente file .gitignore , justo encima del directory foo :

 foo/ !foo/baz 

Espero que esto ignore todo en el directory foo , excepto que no debe ignorar baz .

Sin embargo, todo en foo aún se ignora. Si ejecuto git check-ignore foo/* , obtengo:

 foo/bar foo/baz 

¿Qué estoy haciendo mal?

Esa formulación particular no es compatible en .gitignore :

Un prefijo opcional " ! " Que niega el patrón; cualquier file coincidente excluido por un patrón anterior se includeá nuevamente. No es posible volver a include un file si se excluye un directory principal de ese file. Git no enumera los directorys excluidos por razones de performance, por lo que los patrones en los files contenidos no tienen ningún efecto, sin importar dónde estén definidos. Ponga una barra invertida (" \ ") delante del primer " ! " Para patrones que comiencen con un literal " ! ", Por ejemplo, " \!important!.txt ".

En cambio, puedes hacer:

 foo/* !foo/baz 

Aquí hay una session de ejemplo para que pueda verla en acción:

 :: tree . `-- foo/ |-- bar `-- baz :: cat .gitignore foo/* !foo/baz :: git status -sb ## Initial commit on master ?? .gitignore ?? foo/ :: git add foo :: git status -sb ## Initial commit on master A foo/baz ?? .gitignore 

Tenga en count que se agregó baz pero se ignoró la barra.

Para ver qué aspecto tienen las cosas si baz no estuviera en foo, podemos restablecer y luego eliminar baz:

 :: git reset :: rm foo/baz :: git status -sb ## Initial commit on master ?? .gitignore 

Tenga en count que foo no aparece aquí, aunque foo / bar aún existe.