.gitignore パターン構文まとめ
コメント・エスケープ・末尾の空白、否定 !、末尾のスラッシュ、アンカリング、*・?・[] ワイルドカード、** ルールまで、gitignore のパターン構文を例の表とともにまとめます。
.gitignore の各行は 1 つのパターンである。構文はシェルの glob に似て見えるが、スラッシュの位置と ** の位置によって意味が大きく変わる。以下の内容は git 公式ドキュメント gitignore(5) を基準とし、例は git 2.50 で実際に確認した。
空行、コメント、エスケープ
- 空行は何にも一致しない。読みやすさのための区切りとして使う。
#で始まる行はコメントである。名前が#で始まるファイルを無視するには、\#のようにバックスラッシュを付ける。- 行末尾の空白は無視される。空白で終わるファイル名が必要なら、
foo\のようにバックスラッシュで空白を保護する。行頭の空白はパターンの一部として残る。 !で始まる行は否定パターンである。名前が!で始まるファイルは\!important.txtのように書く。
末尾の空白は目に見えないため、よくあるミスの原因になる。ルールが効かないときは、エディターで空白の表示をオンにしてみよう。取り除かれるのは空白文字だけで、タブは取り除かれない点も覚えておく。
末尾のスラッシュ: ディレクトリにのみ一致
パターンが / で終わると、ディレクトリにのみ一致する。build/ は build というディレクトリとその中のすべてを無視するが、build という名前のファイルは無視しない。逆に build のようにスラッシュなしで書くと、同名のファイルとディレクトリの両方に一致する。
スラッシュがあると位置が固定される
末尾のスラッシュを除いた残りの部分の先頭または途中に / があると、そのパターンは .gitignore ファイルがあるディレクトリを基準としたパスにのみ一致する。これは一般にアンカリング(anchoring)と呼ばれる。/ がなければ、.gitignore がある場所以下のあらゆる深さで名前が一致する項目を探す。
| パターン | 一致 | 一致しない |
|---|---|---|
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/ | doc/frotz/ ディレクトリ | a/doc/frotz/ |
frotz/ | frotz/, a/frotz/ ディレクトリ | frotz ファイル |
特に紛らわしいのは 3 行目である。logs/debug.log は途中にスラッシュがあるためルート基準で固定され、先頭に / を付けたのと同じ意味になる。あらゆる深さの logs/debug.log を捉えるには **/logs/debug.log を使う。
ワイルドカード: *, ?, [ ]
*は/を除くあらゆる文字列(空文字列を含む)に一致する。*.logはapp.log、a/b/app.logの両方に一致するが、logs/*.logはlogs/app.logにのみ一致し、logs/2026/app.logには一致しない。?は/を除く 1 文字に一致する。file?.txtはfile1.txtに一致し、file10.txtには一致しない。[a-z]は範囲内の 1 文字、[!a-z]または[^a-z]は範囲外の 1 文字に一致する。*.py[cod]は.pyc、.pyo、.pydを一度に捉える。ブラケットも/には一致しない。[[:digit:]]のような POSIX 文字クラスも使える。
2 つのアスタリスク **
** はスラッシュと隣接しているときだけ特別な意味を持つ。
| 形 | 意味 | 例 |
|---|---|---|
**/foo | あらゆる深さの foo | foo, a/foo, a/b/foo |
**/logs/debug.log | あらゆる深さの logs/debug.log | logs/debug.log, app/logs/debug.log |
abc/** | abc の中のすべて | abc/x, abc/x/y (ただし abc 自体は除く) |
a/**/b | 間にディレクトリが 0 個以上 | a/b, a/x/b, a/x/y/b |
それ以外の位置、たとえば foo** や **bar の ** は通常の * のように動作し、スラッシュを越えられない。docs/**/*.pdf は docs/manual.pdf と docs/a/b/manual.pdf の両方に一致する。/**/ が 0 個のディレクトリにも一致するためである。
小さな例 1 つでまとめ
# ビルド結果(ルートの build ディレクトリのみ)
/build/
# あらゆる深さのログファイル。ただし重要なログは残す
*.log
!important.log
# docs 配下のすべての PDF
docs/**/*.pdf
# 名前が # で始まるファイル
\#scratch.md
| パス | 結果 | 決定したルール |
|---|---|---|
build/app.js | 無視 | /build/ |
src/build/app.js | 追跡 | なし |
logs/server.log | 無視 | *.log |
logs/important.log | 追跡 | !important.log |
docs/api/v1.pdf | 無視 | docs/**/*.pdf |
#scratch.md | 無視 | \#scratch.md |
この表は、ジェネレーターのパターンテストタブにルールとパスを貼り付ければ、そのまま再現できる。
参考
- gitignore 公式ドキュメント (git-scm.com)
- GitHub Docs: Ignoring files
- 確認基準日: 2026-09-23 (git 2.50.1 で例を検証)