ビルド出力ディレクトリの Git での無視
コンパイル済みおよびビルド出力ディレクトリの git での無視方法。dist/、build/、out/、target/ や、全言語のフレームワーク固有ビルドアーティファクトを解説します。
Pattern
詳細な説明
ビルド出力ディレクトリには、ソースコードから完全に再現可能なコンパイル済み、バンドル済み、または生成されたファイルが含まれます。これらをコミットするとリポジトリ容量を浪費し、膨大な差分を生じさせ、手動で解決不可能なマージコンフリクトを引き起こすことがあります。
エコシステム別の一般的なビルド出力ディレクトリ:
| ディレクトリ | 使用元 |
|---|---|
dist/ |
Vite、Rollup、TypeScript、Angular、Python setuptools |
build/ |
Create React App、Gradle、Go、多くの汎用プロジェクト |
out/ |
Next.js 静的エクスポート、IntelliJ IDEA、TypeScript |
target/ |
Maven、Rust (Cargo)、Scala (sbt) |
bin/ |
.NET、Eclipse、Go |
obj/ |
.NET、C# |
.next/ |
Next.js サーバーおよびクライアントビルドキャッシュ |
.nuxt/ |
Nuxt.js |
_site/ |
Jekyll、Eleventy |
ビルド出力をコミットすべきでない理由:
- サイズ — バンドル済み JavaScript、コンパイル済み JAR、リンク済みバイナリは、生成元のソースコードよりも桁違いに大きいことがあります。
- 再現性 — すべての CI/CD パイプラインはソースからリビルドします。コミットされたビルド出力は、成果物が古くなったときに壊れる「git からデプロイ」という誤った安心感を生み出します。
- マージコンフリクト — ハッシュ化されたファイル名を持つミニファイされたバンドルはビルドごとに変わります。異なるブランチからビルドした2人の開発者は、手動でマージ不可能なコンフリクト出力を生成します。
- セキュリティ — ビルド出力のソースマップは元のソースコードを露出させる可能性があります。ビルドアーティファクトにはビルドプロセス中の環境変数のシークレットが埋め込まれる場合があります。
ベストプラクティス:
- CI/CD パイプライン(GitHub Actions、GitLab CI、Jenkins)を使用してアーティファクトのビルドとデプロイを行います。
- リリースアーティファクトは専用のアーティファクトリポジトリ(npm レジストリ、Docker レジストリ、Maven Central、S3)に保存します。
- ビルド済みファイルを配布する必要がある場合(例: npm パッケージ)、
package.jsonのfilesフィールドを使用して公開対象を制御し、コミット対象とは分離します。
すべてを捕捉する: ディレクトリ名とワイルドカードパターンの両方を追加します:dist/ はディレクトリを無視し、**/dist/ はモノレポ内のネストされたものも捕捉します。
ユースケース
Turborepo を使用するモノレポチームが、あるパッケージのコミット済みビルドアーティファクトがパイプライン内のすべてのパッケージの CI キャッシュ無効化を引き起こしていることを発見しました。