9月23日、Mihai Dinculescuが「Two git ignore files nobody told me about」と題した記事を公開した。gitの除外設定といえば.gitignore一択だと思い込んでいるエンジニアに向けて、長年見落とされてきた2つのファイルを紹介している。
.gitignoreに書けばファイルは無視される。しかし.gitignore自体はコミットされる。自分のメモ、AIエージェントのプランファイル、スクラッチノート — リポジトリと関係はあるが絶対にコミットしたくない個人的なファイルを、チームメンバーに名前すら見られずに除外できたら理想的だ。Dinculescuはこの問題に長年気づかず放置していたが、Claude Code(AnthropicのAIコーディングエージェント)が「.git/info/excludeに追加しますか?」と提案してきたことで、その存在を初めて知ったという。
gitが参照する3つの除外ファイル
gitは同じ構文で、3か所からignoreパターンを読み込む(公式ドキュメント: gitignore)。
| ファイル | 影響範囲 | コミットされるか | 典型的な用途 |
|---|---|---|---|
.gitignore(任意のディレクトリ) |
リポジトリをクローンした全員 | される | target/、__pycache__/、.venv/など |
.git/info/exclude |
そのクローンのみ | されない | 自分だけのスクラッチファイル |
~/.config/git/ignore(core.excludesFileで設定) |
そのマシンの全リポジトリ | されない | .idea/、.DS_Storeなど |
.git/info/exclude — チームに見せずに個人ファイルを隠す
特に実用的なのが**.git/info/excludeだ。.gitディレクトリの中に存在するため、そもそもコミットできない構造**になっている。他のメンバーには見えないし、誤ってpushする心配もない。
リポジトリルートから以下を実行するだけで使える。
echo 'plans/' >> .git/info/exclude
echo '*.notes.md' >> .git/info/exclude
パターンの書き方は.gitignoreと完全に同じだ。このファイルは通常すでに存在しており、コメントアウトされたサンプルが数行書かれている。
1点注意がある。 git worktreeのリンク済みworktreeでは、.gitはディレクトリではなくファイルになるため、上記のパスが使えない。その場合は以下のコマンドが確実だ。
echo 'plans/' >> "$(git rev-parse --git-common-dir)/info/exclude"
なお、Claude Codeはデフォルトでgitignore対象のファイルを@ファイル参照のオートコンプリートから除外する。.git/info/excludeに追加した瞬間、ピッカーからも消える仕様だ。元の挙動に戻すにはsettings.jsonに以下を追加する。
{
"respectGitignore": false
}
この設定は@オートコンプリートの対象ファイルに関するものであり、Claude Code自体はこの設定に関わらずファイルを読み込める。
~/.config/git/ignore — エディタ・OS生成ファイルはここに書く
もう1つの**~/.config/git/ignore**は、そのマシン上のすべてのリポジトリに適用されるグローバルな除外設定だ。.DS_Storeや.idea/など、エディタやOSが生成するファイルはプロジェクト固有のものではないのに、多くのプロジェクトの.gitignoreに書かれてしまっている。本来こちらに書くべき内容だ。
mkdir -p ~/.config/git
echo '.DS_Store' >> ~/.config/git/ignore
echo '.idea/' >> ~/.config/git/ignore
~/.config/git/ignoreは存在すればgitが自動的に読み込む($XDG_CONFIG_HOMEを設定している場合は$XDG_CONFIG_HOME/git/ignore)。別の場所に置きたければ以下で指定できる。
git config --global core.excludesFile ~/.gitignore_global
共通の注意点
いずれの方法も、すでにトラッキング済みのファイルには効果がない。ignoreルールは未追跡ファイルにのみ有効で、一度git addしたファイルを除外したい場合はgit rm --cached <file>で追跡を外す必要がある。
用途に応じた3ファイルの使い分けを知っていれば、.gitignoreに個人用の設定を混ぜることも、git statusが汚れたままになることも避けられる。
詳細はTwo git ignore files nobody told me aboutを参照していただきたい。