Gitの誰も教えてくれなかった2つのignoreファイル
Two Git ignore files nobody told me about (mihai.dinculescu.dev)
要約
この記事では、開発者がGitでファイルを無視する方法として`.gitignore`しか知らなかったために発生していた問題を解説しています。`.gitignore`はリポジトリにコミットされ共有されるため、個人的なメモや設定ファイルなどのローカル専用のファイルを無視するのに不向きでした。しかし、`.git/info/exclude`ファイルとグローバルなignoreファイル(`~/.config/git/ignore`)の存在を知ったことで、リポジトリをクリーンに保ちつつ、機密情報や個人的なファイルを安全に管理できるようになりました。
全文翻訳
私の多くの悪い習慣の一つに、作業中のリポジトリに追跡されていないファイルを溜め込んでしまうことがあります。
しばらく前に、そのようなファイルに機密情報を含めてはならないことを学びました。なぜなら、遅かれ早かれ誤ってコミットされてしまうからです。私はそれを楽な方法で学びました。同僚が苦労して学んでいるのを見て、彼は必死に履歴を書き換えて痕跡を隠し、パニック状態でクラウドの認証情報をローテーションしていました。
最近では、追跡されていないファイルは無害です。ランダムなMarkdownノートや、多くの場合エージェントの計画です。まだそれらをコミットし始めていません。それらはすぐに古くなるので、労力に見合う価値があるとは確信していません。
では、なぜ常にダーティなワーキングツリーを我慢していたのでしょうか?それは、ごく最近まで、Gitでファイルを無視する唯一の方法は.gitignoreに追加することだと知っていたからです。そして.gitignoreはコミットされます。これは、リポジトリをクローンする誰もが持つべきもの、例えば古典的な.envにはまさに適していますが、私のプライベートノートのために選んだくだらないファイル名をリモートリポジトリにプッシュするのは、クリーンではありません。だから私は何もしませんでした。そして、追跡されていないファイルは積み重なっていきました。最後に数えたときは、約10個の計画がありました。
しかし、Claudeが突然、「これらのファイルを.git/info/excludeに追加しましょうか?」と尋ねてきました。
待て、なんだって?それは何だ?
3つの無視ファイル
Gitは3つの場所から無視パターンを読み取ることがわかりました。すべて同じ構文です。
| 場所 | 影響を受ける人 | コミットされるか? | 一般的な使用例 |
|---|---|---|---|
.gitignore、任意のディレクトリ内 | リポジトリをクローンする全員 | はい | ビルド出力とローカル環境: target/, __pycache__/, .venv/ |
.git/info/exclude | このクローンのみ | いいえ | プロジェクトが知る必要のない、あなた自身のスクラッチファイル |
グローバル除外ファイル、core.excludesFileで設定(デフォルト ~/.config/git/ignore) | このマシン上の、あなたが作業するすべてのリポジトリ | いいえ | エディタやOSのゴミ: .idea/, .vscode/, Thumbs.db, .DS_Store |
リポジトリごとの.git/info/excludeは、私が興奮しているものです。これは.gitの中に存在するため、誤ってコミットされることもなく、他の誰もそれを見ることはありません。おそらく、すぐに~/.config/git/ignoreにいくつかのものを移動するでしょう。エディタのゴミは、どのプロジェクトの.gitignoreにも存在するべきではありません。それなのに、ほとんどのプロジェクトに存在しています。
もちろん、これらすべては公式ドキュメントに非常にきれいにまとめられています。もし私がそれを読もうと思ったり、あるいは検索しようと思ったりしていればよかったのですが。私はそうしませんでした。そして、Gitは私たちほとんどが偶然に学んだツールであり、そのうちのいくつかは幸運で、いくつかはそうでないと、少額の賭けをしてもいいでしょう。幸いなことに、これは前者でした。
それらの使用方法
新しい2つはプレーンテキストファイルで、.gitignoreと同じパターンを取ります。専用のGitコマンドはありません。単に追加するだけです。
リポジトリごと、リポジトリのルートから:
echo 'plans/' >> .git/info/exclude
echo '*.notes.md' >> .git/info/exclude
パターンは、トップレベルの.gitignoreにある場合とまったく同じように、リポジトリのルートに対して相対的にマッチします。このファイルは通常すでに存在しており、いくつかコメントアウトされた例が含まれています。注意点:リンクされたGitワークツリーでは、.gitはディレクトリではなくファイルになるため、上記のパスは機能しません。除外ファイルは、メインリポジトリの.git/info/excludeに存在し、すべてのワークツリーをカバーします。これは、メインリポジトリからも、任意のリンクされたワークツリーからも、正しいファイルに解決されます。
echo 'plans/' >> "$(git rev-parse --git-common-dir)/info/exclude"
グローバルに:
mkdir -p ~/.config/git
echo '.DS_Store' >> ~/.config/git/ignore
echo '.idea/' >> ~/.config/git/ignore
Gitは、存在する場合(またはその変数を設定している場合、$XDG_CONFIG_HOME/git/ignore)、~/.config/git/ignoreを自動的に読み込みます。設定するものは何もありません。もし別の場所に保存したい場合は、一度Gitに指示してください。
git config --global core.excludesFile ~/.gitignore_global
どちらのファイルを使用しても、ファイルがすでに追跡されていない限り、git statusはすぐにそれらのファイルのリストを停止します。無視ルールは追跡されたファイルには決して適用されません。
Claude Codeに関する注記
エージェントの計画を無視することが実行例だったので:デフォルトでは、Claude Codeは、@でファイルを参照する際のオートコンプリートから無視されたファイルを除外します。そのため、計画が.git/info/excludeに入った瞬間に、ピッカーから消えます。
それらを元に戻すには、settings.jsonに以下を追加します(または/configでRespect .gitignore in file pickerを切り替えます)。
{
"respectGitignore": false
}
これは@オートコンプリートに関するものです。Claude Codeは設定に関係なくファイルを読み取ることができます。タイプ時に提供されるだけです。設定リファレンスに詳細があります。
というわけで、お分かりいただけたでしょうか。もし、私のように.gitignoreしか知らず、自分のメモの取り方の習慣をプロジェクトの全員と共有することに躊躇していたなら、あなたは今、露出していると感じることなく、クリーンなワーキングツリーを持つことができます。
AI利用に関する免責事項
英語は私の母国語ではなく、どの言語でも才能のあるライターではありません。そのため、AIを使って文章を推敲しています。アイデア、セットアップ、間違い、意見はすべて私自身のものです。それらはAIに、不完全な英語での徹底したメモとして渡され、AIが英語を修正します。思考は提供されませんが、信頼できるリサーチアシスタントです。