guide

.gitignore パターン構文まとめ

コメント・エスケープ・末尾の空白、否定 !、末尾のスラッシュ、アンカリング、*・?・[] ワイルドカード、** ルールまで、gitignore のパターン構文を例の表とともにまとめます。

.gitignore の各行は 1 つのパターンである。構文はシェルの glob に似て見えるが、スラッシュの位置** の位置によって意味が大きく変わる。以下の内容は git 公式ドキュメント gitignore(5) を基準とし、例は git 2.50 で実際に確認した。

空行、コメント、エスケープ

末尾の空白は目に見えないため、よくあるミスの原因になる。ルールが効かないときは、エディターで空白の表示をオンにしてみよう。取り除かれるのは空白文字だけで、タブは取り除かれない点も覚えておく。

末尾のスラッシュ: ディレクトリにのみ一致

パターンが / で終わると、ディレクトリにのみ一致する。build/build というディレクトリとその中のすべてを無視するが、build という名前のファイルは無視しない。逆に build のようにスラッシュなしで書くと、同名のファイルとディレクトリの両方に一致する。

スラッシュがあると位置が固定される

末尾のスラッシュを除いた残りの部分の先頭または途中/ があると、そのパターンは .gitignore ファイルがあるディレクトリを基準としたパスにのみ一致する。これは一般にアンカリング(anchoring)と呼ばれる。/ がなければ、.gitignore がある場所以下のあらゆる深さで名前が一致する項目を探す。

パターン一致一致しない
debug.logdebug.log, logs/debug.log
/debug.logdebug.loglogs/debug.log
logs/debug.loglogs/debug.logapp/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 を使う。

ワイルドカード: *, ?, [ ]

2 つのアスタリスク **

**スラッシュと隣接しているときだけ特別な意味を持つ。

意味
**/fooあらゆる深さの foofoo, a/foo, a/b/foo
**/logs/debug.logあらゆる深さの logs/debug.loglogs/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/**/*.pdfdocs/manual.pdfdocs/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

この表は、ジェネレーターのパターンテストタブにルールとパスを貼り付ければ、そのまま再現できる。

参考

← 前へ何を無視し、何をコミットするか