.gitignore ルールテスター
開発ツール
読み込み中
ツールを読み込んでいます
ツールのコードは開いたときにのみ読み込まれます。
このツールの処理はすべてブラウザー内で行われ、入力内容はサーバーへ送信されません。
このツールについて
ルートの .gitignore 1つと改行区切りのサンプルパスを貼り付け、リポジトリを開かずにルールの効果を確認できます。結果では除外、明示的な除外解除、ルールに未一致、無効なパスを区別し、親ディレクトリから継承した除外も含めてルールの行で根拠を示します。固定バージョンの ignore 7.0.12 を使い、大文字・小文字を区別して UTF-8 バイト単位でローカル照合します。ファイルシステムの読み取りや Git の実行は行いません。
主な用途
- 生成ファイル、ログ、一時ディレクトリを除外しつつ、必要な例外ファイルが残るか確認する。
- 共有するルート .gitignore を変更する前に、除外された親の下で ! の例外が効かない理由を調べる。
- 代表的な少数のパスでルール変更前後を検証し、レビュー用のプレーンテキストレポートを保存する。
使い方
- 1.ルート .gitignore のルールと、ルート相対のサンプルパスを1行ずつ貼り付けるか、サンプルを読み込みます。区切りは / とし、ディレクトリは末尾を / にします。それ以外はファイルです。意味のある空白を残し、引用符は付けません。
- 2.テストを実行し、各状態と根拠となるルールの行を確認します。ignored は除外、unignored は ! による明示的な除外解除、unmatched は有効なルールに未一致、invalid は入力条件を満たさないパスです。子パスの判定が親の除外で決まることもあります。状態で絞り込んで確認でき、1ページに25件のパスを表示します。
- 3.コピーやダウンロードの前にプライバシーの注意を確認します。レポートには元のパスとパターンが含まれます。入力を編集したら再テストしてください。入力または表示言語を変更すると、前の結果とレポートは消去されます。
実行して確かめられるルールとパス
順序のある除外と明示的な例外
{
"rules": "*.log\n!important.log\nprivate/*.log",
"paths": "debug.log\nimportant.log\nprivate/important.log\nREADME.md"
}{
"statuses": [
"ignored",
"unignored",
"ignored",
"unmatched"
]
}出力の状態はサンプルパスと同じ順序です。important.log は明示的な例外ですが、後の private/*.log が private/important.log を再び除外します。README.md は未一致です。JSON は2つのテキスト入力を表すので、各文字列をデコードした内容を対応する欄に貼り付けてください。
親の除外が子の例外を阻む
{
"rules": "build/\n!build/keep.txt",
"paths": "build/\nbuild/keep.txt\nbuild/output.js\nsrc/main.js"
}{
"statuses": [
"ignored",
"ignored",
"ignored",
"unmatched"
]
}build/ が親とその配下を除外します。後の子ファイルの例外では親を開き直せないため、build/keep.txt は除外されたままです。src/main.js は未一致です。親のルールを根拠として示しますが、実ファイルを確認したという意味ではありません。
ルート固定と大文字・小文字の区別
{
"rules": "/cache/\n*.tmp",
"paths": "cache/\ncache/data.json\napp/cache/data.json\napp/draft.tmp\nDRAFT.TMP"
}{
"statuses": [
"ignored",
"ignored",
"unmatched",
"ignored",
"unmatched"
]
}/cache/ はルートの cache に作用し、app/cache には作用しません。*.tmp は下位のパスにも一致しますが、大文字の DRAFT.TMP は大文字・小文字を区別する小文字のルールには一致しません。
** で0階層以上のディレクトリに対応
{
"rules": "docs/**/draft?.md",
"paths": "docs/draft1.md\ndocs/a/b/draft2.md\ndocs/draft10.md\nother/docs/draft1.md"
}{
"statuses": [
"ignored",
"ignored",
"unmatched",
"unmatched"
]
}独立した ** セグメントは中間ディレクトリ0階層以上に対応します。ここで ? は1バイトだけに一致するため、draft10.md は一致しません。ルール内のスラッシュにより、パターンはルートの docs を基準にします。
記号のリテラルと末尾空白の保持
{
"rules": "# comment\n\\#draft\n\\!todo\nnote\\ ",
"paths": "#draft\n!todo\nnote \nnote\n note"
}{
"statuses": [
"ignored",
"ignored",
"ignored",
"unmatched",
"unmatched"
]
}1行目はコメントです。エスケープした # と ! はファイル名の文字そのものに一致します。note\ の後に空白を置くと、末尾に空白が1つある note に一致します。末尾空白のない note や先頭空白のある note には一致しません。JSON で空白とバックスラッシュを確認できます。
ディレクトリとファイルの問い合わせの違い
{
"rules": "a/*",
"paths": "a/\na\na/file.txt"
}{
"statuses": [
"ignored",
"unmatched",
"ignored"
]
}末尾スラッシュはディレクトリの問い合わせを表します。git check-ignore と同様に、明示的な a/ は空の最終部分で a/* に一致しますが、ファイルの a は未一致です。ディレクトリ走査のシミュレーションとして解釈しないでください。
ワイルドカードは UTF-8 バイト単位
{
"rules": "x?y\nx??y",
"paths": "xay\nxéy\nx😀y"
}{
"statuses": [
"ignored",
"ignored",
"unmatched"
]
}xay は x?y に一致します。é は UTF-8 で2バイトなので xéy は x??y に一致します。絵文字は4バイトで、どちらにも一致しません。入力上限の UTF-16 コード単位と、照合時のバイト単位は別です。
曖昧なパスや相対でないパスを拒否
{
"rules": "*.tmp",
"paths": "/tmp/cache.tmp\nC:/cache.tmp\nsrc\\cache.tmp\n./cache.tmp\n../cache.tmp\nsrc//cache.tmp\nsrc/../cache.tmp\nsrc/cache.tmp"
}{
"statuses": [
"invalid",
"invalid",
"invalid",
"invalid",
"invalid",
"invalid",
"invalid",
"ignored"
]
}絶対パス、ドライブ接頭辞、バックスラッシュ区切り、ドットセグメント、連続した区切りは、黙って正規化せず無効にします。最後のルート相対 POSIX パスは有効で *.tmp に一致します。無効な行は、有効だが未一致のパスと区別されます。
よくある除外ルールのテストミス
- シェルの glob、正規表現、Windows のバックスラッシュを .gitignore のパス構文として使うこと。
- !child/path で除外された親を再び開けると思うことや、unmatched を明示的な例外と読むこと。
- サンプルパスの空白を削る、引用符を付ける、ディレクトリを表す末尾 / を忘れること。
- ? が見た目の Unicode 文字数を数えると考えたり、独立した ** セグメントの代わりに *** や埋め込んだ ** を使ったりすること。
- 除外の結果を追跡済みファイルや秘密情報の削除の証拠と考えたり、未編集のレポートを確認せず共有したりすること。
制限と注意事項
- 評価するのは貼り付けたルート .gitignore のみです。入れ子の .gitignore、.git/info/exclude、グローバル除外、リポジトリ設定、追跡済みファイルの状態は読み取りません。除外判定で追跡済みファイルを取り除くことはできず、Git 履歴に秘密情報がないことも保証しません。シンボリックリンクのサンプルはファイルとして扱い、リンクの追跡やディレクトリの走査は行いません。
- パスは大文字・小文字を区別する POSIX 形式の / 区切りです。絶対パス、ドライブ接頭辞、バックスラッシュ、. と .. のセグメント、内部の空セグメント、NUL、ASCII 制御文字、不正な Unicode は拒否します。サンプルパスの前後の空白はそのまま保持し、空行はスキップします。LF と CRLF に対応します。ルールはコメント、先頭 # と ! のエスケープ、否定、*、?、文字クラス、独立した ** セグメントに対応します。*** やセグメントの一部である ** は曖昧なため拒否し、推測で処理しません。ルール内の ASCII 制御文字や不正な Unicode も受け付けません。
- ルールは UTF-8 で32 KiB、物理行数200行、1行あたり256 UTF-16 コード単位までです。パス入力は合計32 KiB、物理行数100行、1パスあたり512 UTF-16 コード単位までです。空行とルールのコメントも行数に含み、最後の改行は追加の1行に数えません。全体の上限超過や未対応のルールではテストを停止し、個別の無効なパスは invalid の行として表示します。 照合処理は 2,000,000 ステップが上限です。複雑なルールとパスの組み合わせは入力サイズの上限より先にこの制限に達する場合があります。入力を減らして再試行してください。部分結果は保持しません。
- 照合は表示上の文字数ではなく UTF-8 のバイト単位です。é には ? が2個、多くの絵文字には4個必要です。末尾 / は完全な走査ではなく git check-ignore path/ と同様のディレクトリ照会を表します。a/* は a/ 自体にも一致しますが、a/*/ と a/**/ は子孫ディレクトリを必要とします。後の子パスの否定ルールは除外済みの親を越えられないため、先に親を再包含してください。
- 処理は読み込み済みのブラウザページ内で行い、入力評価のためのリポジトリ、ファイルシステム、ネットワークへのアクセスはありません。プレーンテキストレポートには無効なパスも含め、元のパスとルールが秘密情報を伏せずに入ります。絞り込みや表示ページにかかわらず全行を出力し、引用符付き文字列で空白を保ち、改行をエスケープします。コピー、ダウンロード、共有の前にプロジェクト名、非公開のファイル名、認証情報を確認してください。保存またはコピー後のレポートはページの管理外です。
よくある質問
build/ の後に !build/keep.txt を書いても効かないのはなぜですか?
親の build ディレクトリが除外されているため、子ファイルのルールだけでは再び到達可能にできません。一部の子を残すには必要な親を除外しないようにし、build/* の後に !build/keep.txt を置くなどして実際のサンプルパスをテストします。後から書いた否定ルールが親の除外を無条件に上書きするわけではありません。
/cache、cache/、通常の cache パターンはどう違いますか?
先頭の / はこの入力で表すルートにパターンを固定します。末尾の / はディレクトリ専用のルールで、ディレクトリのサンプルにも末尾の / が必要です。通常の名前はルート配下の複数階層にあるファイルやディレクトリに作用します。明示的なディレクトリ問い合わせには制限欄で説明した末尾スラッシュの動作があるため、ディレクトリと対象の子パスを両方テストしてください。
空白や先頭の #、! で結果が変わるのはなぜですか?
# で始まるルールはコメント、! で始まるルールは例外です。文字そのものに一致させるには先頭の文字をバックスラッシュでエスケープします。ルール末尾の未エスケープ空白は無視され、エスケープした空白は意味を持ちます。サンプルパスはトリミングしないため、note、末尾に空白がある note、先頭に空白がある note は別の入力です。
ignored なら Git は追跡をやめたりファイルを保護したりしますか?
いいえ。このページは仮のパスにテキストのルールを適用するだけです。Git インデックスの確認、追跡済みファイルの削除、出力の秘匿化、履歴の監査は行いません。変更を検証するときは自分のリポジトリの状態と除外診断も確認してください。除外パターンは秘密情報の保護対策ではありません。