guide

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

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ãoCorrespondeNão corresponde
debug.logdebug.log, logs/debug.log
/debug.logdebug.loglogs/debug.log
logs/debug.loglogs/debug.logapp/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: *, ?, [ ]

Dois asteriscos **

** só tem significado especial quando está junto de barras.

FormaSignificadoExemplos
**/foofoo em qualquer profundidadefoo, a/foo, a/b/foo
**/logs/debug.loglogs/debug.log em qualquer profundidadelogs/debug.log, app/logs/debug.log
abc/**tudo dentro de abcabc/x, abc/x/y (mas não o próprio abc)
a/**/bzero ou mais diretórios no meioa/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
CaminhoResultadoRegra decisiva
build/app.jsIgnorado/build/
src/build/app.jsRastreadoNenhuma
logs/server.logIgnorado*.log
logs/important.logRastreado!important.log
docs/api/v1.pdfIgnoradodocs/**/*.pdf
#scratch.mdIgnorado\#scratch.md

Você pode reproduzir esta tabela colando as regras e os caminhos na aba Testar padrões do gerador.

Referências

← AnteriorO que ignorar e o que commitar