Gitignore ワイルドカードと Glob パターンガイド
gitignore ワイルドカード構文(*、**、?、文字範囲)をマスター。ディレクトリとファイルのマッチングの違いを実例付きで解説します。
詳細な説明
gitignore はシェルのグロビングに似たパターン構文を使用しますが、重要な違いがあります。ワイルドカードを理解することが、間違ったファイルを誤って除外・包含しない正確で保守しやすい無視ルールを書くための鍵です。
*** ワイルドカード(単一レベル):**
* はスラッシュ(/)以外の任意の文字にマッチします。単一のディレクトリレベル内でのみ動作します。
*.log— カレントディレクトリとすべてのサブディレクトリのerror.log、debug.logにマッチ。build/*—build/直下のファイルにマッチしますが、build/sub/dir/内のファイルにはマッチしません。*.py[cod]— 文字クラスと組み合わせて.pyc、.pyo、.pydファイルを1つのパターンでマッチ。
**** ワイルドカード(ディレクトリ横断):**
** は0個以上のディレクトリにマッチします。利用可能な最も強力な glob パターンです:
**/logs— ツリー内のどこにでもあるlogsディレクトリにマッチ(logs/、src/logs/、a/b/c/logs/)。logs/**—logs/ディレクトリ内のすべてに任意の深さでマッチ。**/logs/**— ツリー内のどこにでもあるlogs/ディレクトリ内のすべてにマッチ。a/**/b—a/b、a/x/b、a/x/y/bなどにマッチ。
? ワイルドカード:
? は(/ 以外の)正確に1文字にマッチします:
file?.txt—file1.txt、fileA.txtにマッチしますが、file10.txtにはマッチしません。
文字範囲 [...]:
*.[oa]—.oと.aファイル(C のオブジェクトファイルとアーカイブ)にマッチ。temp[0-9].log—temp0.logからtemp9.logにマッチ。[Dd]ebug/— 大文字小文字の柔軟性のためにDebug/とdebug/の両方にマッチ。
末尾スラッシュ(ディレクトリマッチング):
末尾の / はパターンがディレクトリのみにマッチすることを意味します:
build/—buildディレクトリとその中のすべてを無視。build(スラッシュなし) —buildという名前のファイルとディレクトリの両方を無視。
先頭スラッシュ(ルート相対):
先頭の / はパターンをリポジトリルートに固定します:
/build— リポジトリルートのbuildのみを無視、src/buildは無視しない。build(先頭スラッシュなし) — ディレクトリツリーのあらゆるレベルのbuildを無視。
特殊文字のエスケープ:
バックスラッシュでリテラルの特殊文字にマッチ:\# は # で始まるファイルに、\! は ! で始まるファイルにマッチします。
パフォーマンスのヒント: 具体的なパターン(例: /node_modules/)は広いワイルドカード(例: **/node_modules/)よりも高速です。git がディレクトリの走査をスキップできるためです。無視するパスが常にリポジトリルートにある場合は先頭スラッシュを使用してください。
ユースケース
モノレポ用の .gitignore を書いている開発者が、15個すべてのパッケージのビルドディレクトリを個別に列挙せずに無視するための ** パターンの仕組みを理解する必要があります。