Por que ! não mantém um arquivo em um diretório ignorado?

Uma exceção não tem efeito enquanto o diretório pai está excluído. Confira a regra do diretório antes de adicionar exceções.

1. Entenda o padrão que falha

Considere build/keep.txt e build/discard.txt não rastreados na raiz. Estas regras excluem o próprio build: o Git não entra nele para encontrar keep.txt. A exceção posterior não recupera esse arquivo.

/build/
!/build/keep.txt

2. Ignore o conteúdo e mantenha um arquivo

Substitua as duas regras pelas seguintes no .gitignore da raiz. build continua acessível, o conteúdo direto é ignorado e keep.txt é reincluído. Exceções mais profundas exigem que todos os diretórios pais possam ser percorridos.

Na mesma prioridade, a última regra correspondente prevalece. Coloque a exceção depois da exclusão e revise também outras regras e arquivos .gitignore aninhados.

/build/*
!/build/keep.txt

3. Verifique ambos os arquivos

Crie os dois arquivos e execute os comandos na raiz. A saída detalhada deve mostrar !/build/keep.txt para keep.txt e /build/* para discard.txt. Uma regra com ! indica reinclusão, não exclusão.

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

O status deve listar build/keep.txt como não rastreado e omitir build/discard.txt. Se já forem rastreados, consulte o artigo específico: regras de exclusão não alteram o índice.

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

Como ignorar arquivos que o Git já rastreia?

Consulte as referências oficiais para conhecer o comportamento exato e mais detalhes: Documentação do Git · Documentação de git check-ignore