依存関係ディレクトリの Git での無視
node_modules、vendor、venv など依存関係ディレクトリの git での無視方法。主要パッケージマネージャーを網羅し、lockfile のコミットが必須である理由を解説します。
詳細な説明
依存関係ディレクトリは、あらゆるプロジェクトで無視すべきファイルの最大のカテゴリです。パッケージマネージャーがダウンロードしたサードパーティライブラリを含み、ギガバイト規模に達することもあります。すべての開発者と CI サーバーが lockfile から再生成します。
エコシステム別の依存関係ディレクトリ:
| ディレクトリ | パッケージマネージャー | 言語 |
|---|---|---|
node_modules/ |
npm、yarn、pnpm | JavaScript/TypeScript |
vendor/ |
Composer、Bundler、Go modules | PHP、Ruby、Go |
venv/、.venv/、env/ |
pip、Poetry | Python |
.bundle/ |
Bundler | Ruby |
Pods/ |
CocoaPods | Swift/Objective-C |
packages/ |
NuGet(旧形式) | C#/.NET |
.dart_tool/ |
pub | Dart/Flutter |
依存関係をコミットすべきでない理由:
- サイズ —
node_modules/だけで中規模プロジェクトでも 100,000 以上のファイルを含むことがあります。クローン、フェッチ、差分表示が極端に遅くなります。 - プラットフォームバイナリ — 多くのパッケージにはコンパイル済みネイティブモジュール(
.node、.so、.dll)が含まれ、プラットフォーム固有です。macOS のnode_modules/は Linux では動作しません。 - 冗長性 — lockfile(
package-lock.json、yarn.lock、Gemfile.lock、composer.lock)がすべての依存関係の正確なバージョンをエンコード済みです。install コマンドの実行でディレクトリを同一に再現できます。
重要:lockfile は必ずコミットしてください!
lockfile を .gitignore に追加してはいけません。lockfile が保証するもの:
- 決定論的ビルド — すべての開発者と CI サーバーがまったく同じバージョンをインストールします。
- セキュリティ監査 —
npm auditや Dependabot などのツールが lockfile を分析して既知の脆弱性を検出します。 - 高速なインストール — lockfile が存在する場合、パッケージマネージャーは依存関係の解決をスキップします。
例外 — ライブラリ作者: ライブラリ(アプリケーションではなく)を管理している場合、一部のエコシステムではダウンストリームの利用者が最新の互換バージョンでテストできるよう lockfile をコミットしないことが推奨されています。これは npm パッケージや Ruby gem に当てはまりますが、デプロイされるアプリケーションには当てはまりません。
モノレポの注意事項: モノレポでは、ルートの node_modules/ とホイストされた依存関係は通常ルートレベルで無視されます。各ワークスペースには独自のネストされた node_modules/ があり、これもルートレベルの無視パターンでカバーされます。
ユースケース
新しい開発者がリポジトリをクローンしたところ、誰かが150,000ファイルの node_modules をコミットしていたため20分かかり、チームが .gitignore を修正するきっかけとなりました。