てもとツール
ツール紹介

.gitignoreの効き方を確かめる手順|決め手の行まで見る

.gitignore と確かめたいファイルの場所を貼り付けて、無視されるかどうかを 1 件ずつ確かめる手順です。決め手になった行の番号、! の行が効かない理由、サブフォルダに置いたときの範囲、書き間違えやすい行の見つけ方まで、画面を追って説明します。

公開読了目安 約5分

この記事の要点

  • 貼り付けた .gitignore で、ファイルごとに無視されるかが出る
  • 決め手になった行の番号がそのまま分かる
  • フォルダごと無視すると、中のファイルを ! で戻せない
  • サブフォルダに置いた .gitignore の効く範囲も確かめられる
  • 行頭の空白や行末のタブなど、見えない書き間違いも指摘する
目次

.gitignore に書いた行が、本当に狙ったファイルを外しているか。 .gitignoreテスターは、それを 1 件ずつ確かめるツールです。

中身と、確かめたいファイルの場所を貼ると、無視されるかどうかと決め手の行が並びます。 書いたつもりで効いていない行も、行番号つきで知らせます。

「外したはずなのに」あるある 3 つ

ブログの原稿やサイトのファイルを Git で管理していると、次のような食い違いが起きます。

  • 下書きフォルダを外したつもりが、まだ変更の一覧に出てくる
  • 1 つだけ残したいファイルに ! を付けたのに、やはり外れたまま
  • 書いた行をよく見ても、どこが違うのか分からない

どれも、書いた本人が読み返しても気づきにくい形です。 行の並びや、目に見えない 1 文字で、読まれ方が変わるためです。

なぜ書いたとおりに外れないのか

.gitignore は、下の行ほど強く、最後に当てはまった行が勝ちます。 そのうえで、フォルダごと外した場所の中は、Git が見に行きません。

そのため、フォルダを外した行のあとに「この 1 つは残す」と書いても効きません。 残したいなら、フォルダごとではなく「フォルダの中身」を外す書き方が要ります。

さらに、行の頭の空白や、行の終わりのタブは、そのまま名前の一部として読まれます。 画面では見えないので、書いた人ほど気づけません。

.gitignoreテスターの使い方

1. 中身とファイルの場所を入れる

上の欄に .gitignore の中身を貼ります。 下の欄には、確かめたいファイルの場所を 1 行に 1 つずつ入れます。

.gitignoreテスターの入力欄。.gitignore の中身の欄にサンプルが入り、確かめるパスの欄に node_modules/ や logs/keep.log など 8 件が入っている。下に置いたフォルダの欄と、大文字と小文字を区別しない切り替えがある

場所は、リポジトリの一番上からの道のりで書きます。 フォルダを確かめたいときは、最後に / を付けます(build/)。

2. 無視されるかと決め手の行を読む

ファイルごとに「無視される」か「無視されない」が並びます。 その下の「決め手」が、判定を決めた行の番号と中身です。

パスごとの判定の一覧。node_modules/ は 2 行目で無視される、dist/main.js は親フォルダ dist/ が 3 行目で無視されているので無視される、src/dist/util.js はどの行にも一致せず無視されない、.env.example は 12 行目の ! で無視の対象から外れている、と並んでいる

サンプルでは、8 件のうち 5 件が無視され、3 件が残ります。 src/dist/util.js が残るのは、3 行目の /dist が一番上の dist だけを指すからです。

3. 効かない ! の行を見つける

サンプルの logs/keep.log は、8 行目で残すつもりの行があるのに無視されています。 カードの下に、枠で囲んだ「効かない ! の行」が出ます。

logs/keep.log の判定カード。決め手は 7 行目「logs/」で、親フォルダ logs/ が無視されているので無視されると書かれている。下の枠に、8 行目「!logs/keep.log」はこのパスに一致するが親フォルダが無視されているので効かない、と説明がある

7 行目の logs/ が、フォルダごと外しているのが原因です。 logs/* と中身だけを外す行に変えると、8 行目が効くようになります。

4. サブフォルダに置いた .gitignore を確かめる

.gitignore は、置いたフォルダより下にだけ効きます。 「この .gitignore を置いたフォルダ」に、そのフォルダの名前を入れます。

置いたフォルダを frontend にしたときの判定。frontend/dist/app.js は 1 行目の /dist で無視され、frontend/debug.log は 2 行目の *.log で無視され、backend/debug.log はこの .gitignore の外と出ている

frontend に置いた場合、/dist は frontend/dist を指します。 backend の中のファイルには効かないので、「この .gitignore の外」と出ます。

5. 行の一覧で書き間違いを探す

結果の下には、行ごとに「決めたパスの数」と注意が並びます。 見えない文字は、記号に置き換えて見せます。

行の一覧。2 行目は行頭に空白があり、3 行目は行末にタブがあり、4 行目は区切りに \ を使っているという注意が付き、いずれも決めたパスはありませんと出ている

「決めたパスはありません」の行は、入れたファイルのどれにも効いていない行です。 注意が付いていれば、その文のとおりに直してから貼り直してください。

こんな場面で使える

  • 原稿のリポジトリに、下書きや画像の元データを入れないための行を足すとき
  • 引き継いだサイトの長い .gitignore から、効いていない行を洗い出すとき
  • モノレポのサブフォルダに置いた .gitignore が、どこまで効くかを確かめるとき
  • Windows と Mac で結果が違うときに、大文字と小文字の扱いを切り替えて比べるとき

使用例

たとえば、ブログの原稿を Git で管理しているライターが、画像の元データを外したいとします。

images/raw/ と書いて、images/raw/photo.psd と images/cover.png を入れます。 前者は無視され、後者は残ると出るので、書いた行が狙いどおりと分かります。

ここで images/raw/keep.txt も残したくなったら、! の行を足して確かめます。 「効かない ! の行」が出たら、images/raw/* に書き換えれば残せます。

安心して使えるポイント

入力した .gitignore とファイルの場所は外部に送らず、ブラウザの中だけで判定します。 社内のリポジトリの設定でも、そのまま貼って試せます。

ただし、すでに Git に記録したファイルは、ここで無視されると出ても変更を追われ続けます。 その場合の外し方と注意点は「.gitignoreが効かない原因と確かめ方」で説明しています。

関連ツール

まとめ

.gitignore の効き方は、行の順番・フォルダごとか中身か・見えない 1 文字で変わります。 見た目で読むより、ファイルを並べて決め手の行を見るほうが確実です。

.gitignoreテスターを開く

補足: 開発者の方へ

照合は git の wildmatch.c と dir.c の手順を写し、UTF-8 のバイト列の上で行います。 そのため ? は日本語 1 文字ではなく 1 バイトに当たります。

親フォルダは上から順に見て、無視されたフォルダで止まります(prep_exclude と同じ)。 / を含まない行は名前だけと、含む行は置き場所からのパス全体と比べます。

期待値は git 2.43.0 の git check-ignore --no-index -v -n に答えさせて作りました。 72 通りの .gitignore と 525 件のパスで、判定と決め手の行が一致しています。

git check-ignore -v --no-index logs/keep.log
# .gitignore:7:logs/	logs/keep.log

あわせて読みたい

同じテーマ・関連ツールの記事です。