Gitignore ワイルドカードと Glob パターンガイド

gitignore ワイルドカード構文(*、**、?、文字範囲)をマスター。ディレクトリとファイルのマッチングの違いを実例付きで解説します。

Pattern

詳細な説明

gitignore はシェルのグロビングに似たパターン構文を使用しますが、重要な違いがあります。ワイルドカードを理解することが、間違ったファイルを誤って除外・包含しない正確で保守しやすい無視ルールを書くための鍵です。

*** ワイルドカード(単一レベル):**

* はスラッシュ(/以外の任意の文字にマッチします。単一のディレクトリレベル内でのみ動作します。

  • *.log — カレントディレクトリとすべてのサブディレクトリの error.logdebug.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/**/ba/ba/x/ba/x/y/b などにマッチ。

? ワイルドカード:

? は(/ 以外の)正確に1文字にマッチします:

  • file?.txtfile1.txtfileA.txt にマッチしますが、file10.txt にはマッチしません。

文字範囲 [...]:

  • *.[oa].o.a ファイル(C のオブジェクトファイルとアーカイブ)にマッチ。
  • temp[0-9].logtemp0.log から temp9.log にマッチ。
  • [Dd]ebug/ — 大文字小文字の柔軟性のために Debug/debug/ の両方にマッチ。

末尾スラッシュ(ディレクトリマッチング):

末尾の / はパターンがディレクトリのみにマッチすることを意味します:

  • build/build ディレクトリとその中のすべてを無視。
  • build(スラッシュなし) — build という名前のファイルとディレクトリの両方を無視。

先頭スラッシュ(ルート相対):

先頭の / はパターンをリポジトリルートに固定します:

  • /build — リポジトリルートの build のみを無視、src/build は無視しない。
  • build(先頭スラッシュなし) — ディレクトリツリーのあらゆるレベルの build を無視。

特殊文字のエスケープ:

バックスラッシュでリテラルの特殊文字にマッチ:\## で始まるファイルに、\!! で始まるファイルにマッチします。

パフォーマンスのヒント: 具体的なパターン(例: /node_modules/)は広いワイルドカード(例: **/node_modules/)よりも高速です。git がディレクトリの走査をスキップできるためです。無視するパスが常にリポジトリルートにある場合は先頭スラッシュを使用してください。

ユースケース

モノレポ用の .gitignore を書いている開発者が、15個すべてのパッケージのビルドディレクトリを個別に列挙せずに無視するための ** パターンの仕組みを理解する必要があります。

試してみる — .gitignore Generator

フルツールを開く