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

プロジェクトの .gitignore に一致ルールがなくても、ファイルが無視される場合があります。設定を変える前に、実際の定義元を調べましょう。

1. 一致ルールの定義元を調べる

リポジトリのルートで、path/to/file を実際の未追跡ファイルのパスに置き換えて実行します。

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

詳細出力には定義元のファイル、行番号、パターンが表示されます。定義元はプロジェクトの .gitignore、.git/info/exclude、グローバル除外ファイルなどです。! は再び対象にするルールです。出力がない場合は追跡済みの可能性もあるので、別途確認してください。

2. グローバル除外ファイルの設定を調べる

有効な core.excludesFile の値と、その値を定義した設定ファイルを確認します。

git config --show-origin --get core.excludesFile

出力がなく終了コードが1なら、この設定が未指定という意味であり、グローバル除外が無効とは限りません。Git は既定の $XDG_CONFIG_HOME/git/ignore も参照します。XDG_CONFIG_HOME が未設定または空なら $HOME/.config/git/ignore を使います。まず check-ignore が報告した定義元を確認してください。

3. 適切なルールを変更して再確認する

出力を基に変更先を決めます。共有するプロジェクトルールは .gitignore、このリポジトリだけの個人用ルールは .git/info/exclude、複数リポジトリで使う個人用ルールはグローバル除外ファイルに置きます。グローバルルールの変更は他のリポジトリにも影響するので、1つのパスのために設定全体を削除しないでください。 プロジェクトの .gitignore は .git/info/exclude や core.excludesFile より優先されます。親ディレクトリが除外されていなければ、プロジェクトの例外で低い優先順位の除外を上書きできます。変更後、実際のパスで再確認します。

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

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

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