初期状態で全ファイルをGit管理対象外にする`.gitignore`の極意
.gitignore Everything by Default
.gitignore Everything by Default
プロジェクトのルートディレクトリで.gitignoreを適切に設定し、すべてのファイルを一度Gitの管理外(ignore)に置くことで、必要なファイルだけを選択的に追加するアプローチです。プロジェクトのセキュリティ向上や、不要なビルドアーティファクトの混入を防ぐのに非常に有効です。具体的には、プロジェクトのルートディレクトリに以下のように設定します。*で全てを除外し、!(感嘆符)を使って必要なディレクトリやファイルだけをホワイトリスト形式でGitに認識させる手法です。*!README.md!src/この設定により、デフォルトですべてのファイルを無視しつつ、READMEとsrcディレクトリ配下のみを明示的にトラッキング対象にできます。
全部無視するっていうのはどうかなと思うけど、自分のGitワークフローで最高だった変更の一つは、~/.config/git/ignore に .* を追加して、デフォルトで全てのドットファイルを無視するようにしたことだね。
プロジェクトのたびに共通のファイル(!.gitignore, !.gitattributes, !.github, !.editorconfig など)をアンイグノア(無視解除)するボイラープレートが必要にはなるけど、それさえ済ませれば、あとは好きな時に .foo.lang ファイルや .tmp/.cache ディレクトリ、Claudeのヘルパー用ファイル(.code_analysis.md)、.todos.txt なんかをプロジェクトに放り込める。gitignoreの管理を忘れて散らかる心配もないしね。もっとみんなこのやり方をすればいいのにって思う。
自分はデフォルトで無視するんじゃなくて、明示的に追加したいものだけをステージングするようにしてる。
ペアプロしてる時に相手が「git add .」って叩くのを何度見たか数え切れないけど、その選択肢はいつも謎だわ。
分からなくはないけど、一つ一つ慎重に選ぶより、全部追加することで発生する問題の方がこれまで多く見てきたし。まあ人それぞれだけどね。
リポジトリに入れるべきじゃないゴミ(例えば CLAUDE.md)
どうして CLAUDE.md や AGENTS.md が「リポジトリに入れるべきじゃないゴミ」なの?プロジェクトでエージェントを使っていて、それ専用のルールがあるなら、リポジトリを使っている他のメンバーにもそのルールを共有して、質の低いコードが生成されないようにするのが当然でしょ?
あんまり良いアドバイスとは思えないな。ファイルを誤ってコミットすることなんて滅多にないし、それよりコミットしなきゃいけないファイルをアンイグノアし忘れる方が100%ありそうだもん。
gitignoreで全部無視する初期設定をわざわざ作るくらいなら、普通のファイルを無視するテンプレートを作って全リポジトリにコピーする方がずっと良くない?
開発者が提案してくるアドバイスって、時々「自分一人で作業してる世界」や「経験不足」な環境から出てきたような奇妙なものがあるよね。
この件に関しては .gitignore_global があれば、言及されている .DS_Store やIDEの設定ファイル、圧縮ファイルなんかの「いつもの犯人」は全部片付く。万が一何かあっても、重要なファイルが入る前の初期スキャフォールド段階で大抵は気づけるし。
もし新人教育してるなら、global gitignore やローカル設定、ドットファイルの話を教えてあげて、手本として自分のがあればそれを見せてあげるのが一番だよ。
追記:ネット上にあるドットファイルの中で最高とは言えないけど、これのおかげでデバイスや環境(仕事用、プロジェクト用、個人用など)の切り替えがすごく楽になった。最近整理して Claude Code で自動化やテストも追加したよ。 https://github.com/brajeshwar/dot
セキュリティエンジニアっぽい考え方だね。
VPSのポートを全閉してから一つずつ開けるっていうのと全く同じアプローチだ。
ただ一つ難点を挙げるとすれば、何を許可すべきかを見極めるのが大変なことかな。ポートなら簡単だけど、ファイルには星の数ほど拡張子があるからね。
アプリやCLIツールが勝手に生成する見たこともない拡張子のファイルなんかで問題が起きる可能性があるし。
それ以外は面白いアプローチだと思うよ。
「git add」を正しく使う練習をしたらどう?「git add -A」を叩き続けることに執着しすぎじゃない?.gitignoreをいじらなくても、コミットしてないファイルをワークツリーに置いておくなんて難しくないよ。
.git/info/exclude をもっと活用するべき!
Cursorを使ってるなら .cursor ディレクトリが作られるよね?ならそれを .git/info/exclude に入れればいい。わざわざプロジェクトの .gitignore をそれで汚す必要なんてないんだよ。.gitignore はソフトウェアのビルドやテストで生成されるアーティファクトや、リポジトリ内のスクリプトのためのものなんだから。
strict_ignore() {
[[ -n "$1" ]] || exit 1
local repo="${1%/}/"
local ignore
ignore=$(find "$repo" -path "$repo".git -prune -o -print \
| sed "s|$repo||g; /^$/d" \
| awk '{print "!"$0}' \
| sort)
printf "*\n%s\n" "$ignore"
}
DS_Store とか node_modules を間違えてコミットする人なんているの?インデックスを確認せずに「追加」して「コミット」までしちゃうってこと? o_O