Guia completo da sintaxe de padrões do .gitignore
Comentários, escapes e espaços finais, negação !, barra final, ancoragem, curingas *, ? e [] e as regras de ** explicados com tabelas de exemplos.
Cada linha de um .gitignore é um padrão. A sintaxe parece a dos globs do shell, mas o significado muda bastante conforme onde estão as barras e onde aparece **. O conteúdo abaixo segue a documentação oficial do git, gitignore(5), e os exemplos foram verificados diretamente com o git 2.50.
Linhas em branco, comentários e escapes
- Uma linha em branco não corresponde a nada. Use-a como separador para facilitar a leitura.
- Uma linha que começa com
#é um comentário. Para ignorar um arquivo cujo nome começa com#, acrescente uma barra invertida, como em\#. - Espaços no fim da linha são ignorados. Se precisar de um nome de arquivo que termina com espaço, proteja o espaço com barra invertida, como em
foo\. Espaços no início da linha continuam fazendo parte do padrão. - Uma linha que começa com
!é um padrão de negação. Para um arquivo cujo nome começa com!, escreva\!important.txt.
Espaços finais são invisíveis e causam erros com frequência. Se uma regra não funcionar, ative a exibição de espaços no editor. Lembre-se também de que só o caractere de espaço é removido; tabulações não.
Barra final: corresponde apenas a diretórios
Se o padrão termina com /, ele corresponde apenas a diretórios. build/ ignora o diretório build e tudo dentro dele, mas não ignora um arquivo chamado build. Já build sem barra corresponde a arquivos e diretórios com esse nome.
Uma barra fixa a posição
Se o restante do padrão, sem contar a barra final, tiver uma / no início ou no meio, o padrão só corresponde a caminhos relativos ao diretório onde está o .gitignore. Isso costuma ser chamado de ancoragem. Sem /, o git procura entradas com o nome correspondente em qualquer profundidade abaixo do .gitignore.
| Padrão | Corresponde | Não corresponde |
|---|---|---|
debug.log | debug.log, logs/debug.log | — |
/debug.log | debug.log | logs/debug.log |
logs/debug.log | logs/debug.log | app/logs/debug.log |
doc/frotz/ | diretório doc/frotz/ | a/doc/frotz/ |
frotz/ | diretórios frotz/, a/frotz/ | arquivo frotz |
A terceira linha é a que mais confunde. logs/debug.log tem uma barra no meio, então fica ancorado na raiz e equivale a colocar / na frente. Para pegar logs/debug.log em qualquer profundidade, use **/logs/debug.log.
Curingas: *, ?, [ ]
*corresponde a qualquer sequência de caracteres exceto/(inclusive a vazia).*.logcorresponde aapp.loge aa/b/app.log, maslogs/*.logcorresponde só alogs/app.log, não alogs/2026/app.log.?corresponde a um único caractere exceto/.file?.txtcorresponde afile1.txt, mas não afile10.txt.[a-z]corresponde a um caractere do intervalo, e[!a-z]ou[^a-z]a um caractere fora dele.*.py[cod]pega.pyc,.pyoe.pydde uma vez. Colchetes também não correspondem a/.- Classes de caracteres POSIX como
[[:digit:]]também podem ser usadas.
Dois asteriscos **
** só tem significado especial quando está junto de barras.
| Forma | Significado | Exemplos |
|---|---|---|
**/foo | foo em qualquer profundidade | foo, a/foo, a/b/foo |
**/logs/debug.log | logs/debug.log em qualquer profundidade | logs/debug.log, app/logs/debug.log |
abc/** | tudo dentro de abc | abc/x, abc/x/y (mas não o próprio abc) |
a/**/b | zero ou mais diretórios no meio | a/b, a/x/b, a/x/y/b |
Em outras posições, como o ** de foo** ou **bar, ele se comporta como um * comum e não atravessa barras. docs/**/*.pdf corresponde tanto a docs/manual.pdf quanto a docs/a/b/manual.pdf, porque /**/ também corresponde a zero diretórios.
Resumo em um pequeno exemplo
# Saída de build (apenas o diretório build na raiz)
/build/
# Arquivos de log em qualquer profundidade, mas mantém o log importante
*.log
!important.log
# Todos os PDFs dentro de docs
docs/**/*.pdf
# Arquivo cujo nome começa com #
\#scratch.md
| Caminho | Resultado | Regra decisiva |
|---|---|---|
build/app.js | Ignorado | /build/ |
src/build/app.js | Rastreado | Nenhuma |
logs/server.log | Ignorado | *.log |
logs/important.log | Rastreado | !important.log |
docs/api/v1.pdf | Ignorado | docs/**/*.pdf |
#scratch.md | Ignorado | \#scratch.md |
Você pode reproduzir esta tabela colando as regras e os caminhos na aba Testar padrões do gerador.
Referências
- Documentação oficial do gitignore (git-scm.com)
- GitHub Docs: Ignoring files
- Verificado em: 2026-09-23 (exemplos conferidos com git 2.50.1)