パスと除外規則

Gitignoreテスター判定の経過を追う

ルートにある一つの.gitignoreと候補パスを検証します。ディレクトリは末尾に/を付けてください。

Gitignoreテスター

.gitignore規則

候補パス

規則と候補文字列はこのブラウザー内で処理します。リポジトリの読み取りや変更はしません。

パスの結果

候補パスを一つ以上入力してください。

パスの指定方法と範囲

この.gitignoreからの相対パスを/で区切り、ディレクトリには末尾/を付けます。絶対パス、ドライブ名、逆斜線、空の区間、.と..は無効です。空白は保持します。

ルートの.gitignore一つで未追跡パスを評価。大文字小文字を区別しUTF-8バイトで比較します。下位規則、グローバル規則、索引、ファイルシステムは読みません。

物理規則50行、空でない候補200行まで。一規則256文字、一パス512文字、32区間まで。制御文字は不可。バックグラウンド処理は2秒で終了します。

結果が古いか、計算中です。

否定規則に正しい名前を書いても、親が除外されていればファイルは戻りません。Gitignoreテスターは、この見落としやすい違いを親パスと行番号で示します。ファイル名に一致する行だけを探すより、原因を絞り込めます。

変更案を試すときは、除外したいファイルと残したいファイルを一緒に入力してください。Gitignoreパターンを一行ずつ追加した時点の全体の判定を残すので、順序を変えた影響も追えます。

Gitignoreテスターで確認できる違い

親の除外と内容の除外を分ける

build/はディレクトリ自体を除外するため、!build/keep.txtでは子を戻せません。一方、cache/*ならcache/を通れるので!cache/keep.txtが働きます。Gitignoreテスターはこの差を親ディレクトリの情報とともに示します。

閉じた親フォルダーが子を遮断し、開いたフォルダーでは例外のファイルが通る様子。

上書きされた判定をたどる

除外、再包含、再除外という順序を結果だけで読み解くのは困難です。履歴には空行やコメントを含む各行の後の判定が並びます。決定行が前の行のままなら、その段階では後から加えた行が結果を変えていないことが分かります。

ファイルが三つの関門を順に通り、除外、包含、除外へと変化する様子。

原因を再現するための三つの確認

01

ファイルパスの基準をそろえる

候補は.gitignoreを置いたディレクトリからの相対パスです。build/はディレクトリ、buildはファイルとして扱います。規則の先頭/は基準位置への固定ですが、候補の先頭/は無効です。ファイル名の空白はそのまま保持されます。

02

最初に遮断される親を見る

履歴を開き、どの親が除外されたか確認してください。必要なら親を再包含するか、cache/*のように内容だけを対象にします。履歴の各段階は規則全体を再評価した結果であり、その段階に追加した行との直接一致ではありません。

03

比較中は自動実行を止める

自動実行は編集後350ミリ秒待ってから始まります。オフにすると実行ボタンとCtrl/Cmd+Enterを使えます。編集直後は旧レポートの出力を停止します。例とクリアはプレビュー後に適用し、元に戻す操作で入力と結果を復元できます。

判定の根拠を残す機能

Git形式の規則を評価

ignore 7.0.9の公開APIで*、?、文字範囲、**を扱います。大文字小文字を区別し、UTF-8バイト単位で比較するため、?一つで日本語一文字を表すことはできません。波括弧展開や正規表現を追加の構文として解釈しません。

コメントを含めた行番号

コメントや空行を除去して番号を詰めることはありません。到達できる各パスでは最後に一致した規則が決定します。同じ除外規則を繰り返しても、最初ではなく最後の一致行を表示します。親から継承した除外も区別します。

用途に合わせて二形式で出力

JSONには元のパス、規則、全段階の履歴を保存します。TSVはディレクトリ区分、除外状態、決定行、規則、親の一覧です。数式に見えるセルには保護用のアポストロフィを加えます。表示が50件でもレポートには全候補を含めます。

評価範囲と入力の上限

一つのルート規則を想定
Gitignoreテスターは未追跡のパスを想定します。下位の.gitignore、.git/info/exclude、グローバル規則、コマンドラインのパターンは合成しません。索引を読まないため、追跡済みか、存在するか、シンボリックリンクかは判断できません。
候補を勝手に補正しない
/区切りの相対パスを入力し、ディレクトリには末尾/を付けます。絶対パス、Windows形式、.と..、制御文字、不正なUnicodeは拒否します。空行は飛ばしますが空白だけの行は名前です。規則先頭の#や!を文字として使う場合はエスケープします。
上限に達したら明示的に停止
物理規則行は50行、空でない候補行は200行までです。一規則256、一パス512のUTF-16コード単位、パス階層は32区間まで。最後の改行一つは追加行に数えません。ワーカーは2秒で打ち切り、失敗した結果や古い結果は出力できません。
実際の環境ではGitで照合
大文字小文字の扱いは固定で、すべてのGitコマンドや設定を再現するものではありません。リポジトリでgit check-ignore -vを使うと実際の規則の出所を確認できます。今回の候補に当たらなかった規則も別のファイルに必要かもしれず、自動削除はしません。 連続した*は独立したパス区間の**のみ扱います。***やa**などは評価範囲外として拒否しますが、Git自体で無効という意味ではありません。

Gitignoreテスターのよくある質問

!を書いてもファイルが戻らないのはなぜですか。

除外された親にはGitが入らないためです。子ファイルの否定規則だけでは親を再包含できません。先に親を戻すか、build/*で内容を除外してから特定の子を戻してください。Gitignoreテスターは遮断している親を表示します。

buildと/buildにはどんな違いがありますか。

buildはどの深さでも同じ名前に一致します。/buildはこの.gitignoreのある位置に固定されます。規則の途中に/がある場合も基準位置からの相対指定です。buildとsrc/buildを候補にすると差を確認できます。

logs/は同じ名前の通常ファイルにも一致しますか。

いいえ。末尾/の規則はディレクトリ専用です。候補logs/はディレクトリ、logsは通常ファイルとして評価します。実際のファイルシステムを調べないため、この区別は入力で指定する必要があります。

**の三つの書き方は何を意味しますか。

先頭の**/は任意の深さ、末尾の/**は子孫、a/**/bは間にゼロ個以上のディレクトリがある場合に一致します。単独の*と?は/を越えません。?はUTF-8の一バイトなので、多バイト文字全体には一致しません。

正しい規則を書いてもGitが変更を表示するのはなぜですか。

追跡済みファイルに.gitignoreを追加しても追跡状態は変わりません。このツールは索引を見ず、未追跡として候補を評価します。実際のリポジトリで追跡状態を確認してから、git statusとの差を判断してください。

確認したいパスの事例がありますか?

規則の変更案を確認する

Gitignoreテスターに除外したいパスと残したいパスを入力します。例外が働かないときは親ディレクトリも候補に加えてください。

履歴をレビューに添え、実際の規則を変更する前にリポジトリ側でもGitで確認しましょう。