guide

何を無視し、何をコミットするか

ビルド成果物・依存関係・キャッシュ・秘密は無視し、lockfile・サンプル設定・チームのエディター設定はコミットする基準、下位の .gitignore、空ディレクトリの維持、テンプレート結合のコツをまとめます。

よい .gitignore は長さではなく基準で判断する。基準は 1 つである。リポジトリを新たに clone した人が、ソースと設定だけで同じ結果を作り直せるか。 作り直せるものは無視し、作り直せないもの、あるいは結果を固定するものはコミットする。

無視するもの

種類理由
ビルド成果物dist/, build/, target/, *.o, *.classソースから作り直す
依存関係のインストール結果node_modules/, vendor/(PHP), .venv/マニフェストと lockfile で再インストールする
キャッシュ・ログ.cache/, .pytest_cache/, *.log, coverage/実行するたびに変わる
ローカル環境・秘密.env, *.pem, local.properties, *.tfstate人や環境ごとに異なる、または流出してはならない
個人のツール状態.DS_Store, *.swp, .idea/workspace.xmlプロジェクトと無関係である (グローバル gitignore を推奨)

コミットするもの

下位ディレクトリに .gitignore を置く

.gitignore はルートにしか置けないわけではない。下位ディレクトリの .gitignore はそのディレクトリを基準に動作し、上位のファイルより優先される。モノレポでパッケージごとに必要なルールが異なるなら、パッケージのフォルダーに別途置く方が読みやすい。

repo/
├── .gitignore          # 共通: .DS_Store, .env, coverage/
├── apps/web/.gitignore # .next/, out/
└── services/api/.gitignore # target/

空ディレクトリを維持する

git はファイルだけを追跡し、空ディレクトリは保存しない。ログフォルダーのようにフォルダーは必要だが中身は無視したい場合は、フォルダー内に目印のファイルを置き、否定ルールで残す。

/log/*
!/log/.keep

.keep.gitkeep という名前は git の公式機能ではなく、慣例にすぎない。どんな名前でも動作する。別の方法として、そのフォルダー内に次の内容の .gitignore を置けば、自分自身だけを残して残りを無視する。

*
!.gitignore

テンプレートを結合するとき

ルールは短く具体的に

*.json のように広すぎるルールは設定ファイルまで飲み込む。できるだけパスを絞り(/dist/)、ディレクトリには末尾にスラッシュを付けて同名のファイルと区別する。ルールの上に 1 行のコメントで理由を書いておけば、次の人が削除してよいか判断できる。

参考

← 前へなぜ無視される? git check-ignore でデバッグする