.gitignore が効かないのはなぜ?

Git が追跡済みのファイル、別の場所にあるルール、想定したパスに一致しないパターンが原因となることがあります。

1. ファイルが追跡済みか確認する

除外ルールは追跡されていないファイルに適用されます。以前コミットしたファイルは、パターンを追加するだけでは Git のインデックスから削除されません。

git ls-files -- path/to/file

パスが表示された場合、そのファイルは追跡済みです。追跡をやめる手順を確認してください。

Git がすでに追跡しているファイルを無視するには?

2. 一致したルールを Git に確認する

リポジトリ内で、リポジトリからの相対パスを指定して確認します。出力には参照元の除外ファイルと行番号が表示されます。

git check-ignore -v -- path/to/file

追跡済みファイルのルールを調べる場合は --no-index を付けます。

git check-ignore -v --no-index -- path/to/file

3. ルールの位置と順序を確認する

先頭の / は、その .gitignore があるディレクトリを基準にします。末尾の / はディレクトリだけに一致します。同じ優先順位では、後の一致ルールが前のルールを上書きできます。! で始まるパターンはパスを再び含められますが、親ディレクトリが除外されていると Git は中を走査しないため、その中のファイルは再び含められません。

! を使っても無視されたディレクトリ内のファイルを残せないのはなぜ?

4. ほかの除外設定を確認する

Git は .git/info/exclude や core.excludesFile で設定したグローバルファイルも参照します。プロジェクトの .gitignore に記載がなくても、ファイルが除外されることがあります。グローバル設定は次のコマンドで確認できます。

git config --get core.excludesFile

グローバルルールでファイルが無視されるのはなぜ?

正確な動作や詳細は、公式の資料を参照してください。 Git のドキュメント