本文へスキップ
AZ Tools

.gitignore テスター

.gitignore は順序のあるパターン一覧で、あるパスに最後に一致した規則が勝ちます。だから「なぜ このファイルは無視されるのか」の答えは、いま見ている行ではないことがほとんどです。このツールは ファイルとパス一覧を受け取り、`git check-ignore -v` と同じやり方で答えます。パスごとに無視の 有無、決めた行番号、そのパターンの原文を示し、ファイル自身ではなく親ディレクトリが決めた場合は そのディレクトリも並べて表示します。 この最後の点にこそ、.gitignore の不具合の大半が潜んでいます。git は除外されたディレクトリの中へ 降りていかないので、`build/` が無視された時点で `!build/keep.txt` は死んだ行になります。ファイルは 親ディレクトリの規則で判定され、否定規則は読まれもしません。本ツールはその状況を個別に警告し、貼り付けたどのパスにも一致しなかった規則も一覧にします。何年も前に名前を変えた coverage/ のような 行が、ここで初めて表に出ます。 照合はシェルのグロブではなく git 自身の解釈に従います。スラッシュを含まないパターンはあらゆる 深さでファイル名と比較し、スラッシュを含むパターンは .gitignore のあるディレクトリに固定され、末尾のスラッシュはディレクトリだけを対象にします。`*` はスラッシュを越えませんが、パス区間を まるごと占める `**` は越えます。[0-9] や [!a-z] などの文字クラス、バックスラッシュで守った末尾の 空白、エスケープした # と !、UTF-8 の BOM や CRLF 改行も git と同じに扱います。貼り付けたパスには 種別の情報がないので、ディレクトリは末尾にスラッシュを付けてください。`build/` はディレクトリ、`build` はファイルとして判定され、その差だけでディレクトリ専用規則の答えが反転します。 分からないこともあります。読むのは .gitignore 一つだけなので、下位ディレクトリの .gitignore、.git/info/exclude、core.excludesFile が指すグローバルファイルは対象外で、そのいずれもここでの 結果を覆せます。また Linux の git と同じく大文字小文字を区別するため、core.ignorecase を有効に した macOS や Windows のリポジトリでは、この表より多く無視されることがあります。処理はすべて ブラウザー内で行われ、ファイルもパスも送信されません。

無視

5

無視されない

3

規則

7

死んだ規則

1

何もしていない否定規則

git は除外されたディレクトリの中へ降りないため、その下の ! 規則は読まれません。ディレクトリ(dir/)ではなく中身(dir/*)を除外すれば意図どおりに動きます。

  • .vscode/settings.json — !.vscode/settings.json (行 10) · 除外された親ディレクトリ .vscode/
パス判定決めた規則
src/index.ts無視されない一致した規則なし
node_modules/react/index.js無視2node_modules/除外された親ディレクトリ node_modules/
dist/無視3dist/
dist/app.js無視3dist/除外された親ディレクトリ dist/
debug.log無視されない6!debug.log
logs/debug.log無視されない6!debug.log
server.log無視5*.log
.vscode/settings.json無視9.vscode/除外された親ディレクトリ .vscode/この ! 規則は効きません
何にも一致しなかった規則

上のどのパスもこれらの行に一致しませんでした。パス一覧が代表的なものなら削除の候補です。

  • 行 4 coverage/

大文字小文字を区別するファイルシステムで、リポジトリ直下の .gitignore 一つを基準に判定します。

使い方

  1. 最初の欄に .gitignore をディスク上のまま貼り付けます。コメント、空行、CRLF 改行、BOM はすべて git と同じ扱いになります。
  2. 次の欄に、確認したいパスをリポジトリのルートからの相対で 1 行に 1 つ書きます。ディレクトリは 行末にスラッシュを付けてください。`logs/` のようなディレクトリ専用規則の判定がそれで変わります。
  3. 表を読みます。各行は無視の有無、決めた行番号、規則の原文を示します。`git check-ignore -v` が 出力する 3 点に、除外された親ディレクトリを加えた形です。
  4. 橙色の枠を確認します。`!` 規則がパスに一致していても、親ディレクトリがすでに除外されていて 効かない場合に出ます。否定規則が正しく見えるのに何も起きない典型的な理由です。
  5. 一番下の死んだ規則の一覧を見ます。貼り付けたどのパスにも一致しなかった行で、パス一覧が代表的な ものであれば削除の候補です。

よくある質問

! を書いたのにファイルが戻ってこないのはなぜですか。
git がそのファイルを見ていないからです。ツリーをたどる途中でディレクトリが除外されて いると分かると、git はそこで止まって中へ降りません。したがってそのディレクトリの中身に 関する規則は評価すらされません。公式文書も「親ディレクトリが除外されているファイルを 再び含めることはできない」と明言しています。`logs/` と `!logs/important.log` を並べても ログは無視されたままで、本ツールは決定がディレクトリ規則から来たことを示します。直し方は ディレクトリではなく中身を除外することです。`logs/*` の次に `!logs/important.log` と 書きます。部分木ごと戻すなら `/logs/**`、`!/logs/keep/`、`!/logs/keep/**` の順が定石です。
build と /build は何が違いますか。
パターンにスラッシュが一つもなければ、あらゆる深さでパスの末尾の名前と比較されます。つまり `build` は /build も /src/build も /a/b/c/build も無視します。末尾以外の位置に スラッシュが一つでもあると、そのパターンは .gitignore の置かれたディレクトリに固定され、`/build` や `docs/output` はそこを起点にしか一致しません。ルートの .gitignore に単に `node_modules` と書くと入れ子のパッケージの node_modules まで隠れるのはこのためです。望みどおりのことが多い一方、意図して書いた人はまれです。「ここだけ」と言いたいときは 先頭にスラッシュを付けます。
`logs/` は logs という名前のファイルにも一致しますか。
いいえ。末尾のスラッシュはディレクトリだけを対象にするという意味なので、logs という 普通のファイルはそのまま残り、どの深さにあっても logs ディレクトリは中身ごと無視され ます。貼り付けたパス一覧に種別の情報がないことがここで効いてきます。git は実際の ファイルシステムを見て判断しますが、本ツールには教える必要があります。ディレクトリは `logs/`、ファイルは `logs` と書いてください。同じ文字列でもスラッシュの有無で逆の答えに なります。これはツールの癖ではなく、まだ存在しないパスに対して `git check-ignore` が 予想と違う答えを返す理由そのものです。
`**` の三つの形はそれぞれ何を意味しますか。
`**` はパス区間をまるごと占めるときだけ特別な意味を持ちます。先頭の `**/foo` はあらゆる 深さの foo に一致し、スラッシュなしのパターンがすでに行うことを明示的に書いた形です。末尾の `foo/**` は foo の中身すべてに一致しますが foo 自身には一致しません。前述の 再包含の手順が成り立つのはまさにこのためです。途中の `a/**/b` は a/b、a/x/b、a/x/y/b の ようにディレクトリ 0 個以上をまたいで一致します。それ以外の位置では単なる星です。`a**b` は `a*b` と同じで、星 1 個はスラッシュを越えないので `src/*.c` は src/main.c には 一致しても src/lib/main.c には一致しません。
規則は正しいのに git が変更を表示し続けます。
.gitignore は git がまだ追跡していないファイルにしか効きません。いったんコミットされた ファイルは、あとからパターンを足しても変わらず、変更が報告され続けコミットされ続けます。まず `git rm --cached パス` で追跡を外し(作業ディレクトリのファイルは残ります)、その 削除をコミットしてください。次のコミットからは無視規則が効きます。本ツールは `check-ignore` と同じく未追跡ファイルについての問いに答えるので、インデックスに入って いるパスは、ここで無視と出ても `git status` に現れ続けます。両者が食い違うときに最初に 確かめる点です。
.gitignore が複数あるとどれが勝ちますか。
git は決まった順序で複数の出所を読み、より具体的なものが勝ちます。まずコマンドラインの パターン、次に .gitignore ファイル群で、深いディレクトリのものが上位のものを上書きします。その次が共有されないリポジトリ固有の .git/info/exclude、最後が core.excludesFile が指す グローバルファイルです。一つのファイルの中では最後に一致した行が決めます。本ツールは .gitignore 一つだけを模しているので、結果が実際のリポジトリと違うなら、下位の .gitignore、info/exclude の項目、グローバルファイルが原因である可能性が高く、その場で `git check-ignore -v` を実行すれば出所の列がファイル名を教えてくれます。

関連ツール