- vendorディレクトリはGit管理すべきか、結論から
- vendorディレクトリとは何かを整理する
- Git管理しないとされる理由
- それでもGit管理したくなる現実的な理由
- 実際にやるとこうなる、失敗しがちなパターン
- 判断のためのチェックポイント
- 代替案という折衷案
- 少しひねったまとめ
vendorディレクトリはGit管理すべきか、結論から
結論を先に言ってしまうと、「原則としてはGit管理しない。ただし条件次第では管理する判断も現実的」です。
vendorディレクトリをGitに含めるかどうかは、思想論や宗教論になりがちですが、実際の現場では「環境再現性」「CI/CD」「チーム構成」「依存解決の安定性」といった要素が複雑に絡みます。
多くのプロジェクトでは「依存関係はパッケージマネージャで再現できる」という前提が成り立つため、vendorディレクトリはGit管理から外されます。一方で、オフライン環境や長期保守、外部要因で依存取得が不安定なケースでは、vendorを含める判断が“現実解”になることもあります。
この記事では、vendorディレクトリをGit管理する/しないの判断軸を、具体例と失敗パターンを交えながら整理していきます。
vendorディレクトリとは何かを整理する
vendorディレクトリとは、外部ライブラリや依存パッケージの実体をプロジェクト配下に配置したものです。言語やエコシステムによって多少意味合いは異なりますが、共通しているのは「自分たちが書いていないコードが大量に入る場所」という点です。
たとえば以下のようなケースがあります。
- PHPのComposerで生成されるvendorディレクトリ
- Go Modulesでvendor化した依存コード
- RubyのBundlerでvendor/bundleを使う構成
- JavaScriptでnode_modulesをvendor相当として扱うケース
多くの開発者が最初につまずくのは、「このディレクトリ、Gitに入れるべき?」という疑問です。公式ドキュメントや記事を読むと、ほぼ必ず「Git管理しない」と書かれている一方で、実際の現場では例外が存在します。
Git管理しないとされる理由
vendorディレクトリをGit管理しない理由は、単なる慣習ではありません。技術的・運用的な理由が積み重なった結果です。
リポジトリサイズが肥大化する
vendorディレクトリには数百〜数千ファイルが含まれることも珍しくありません。これをGit管理すると、cloneやfetchのたびに余計なデータ転送が発生します。
特に以下のような状況では問題が顕在化します。
- CIで毎回フルcloneしている
- 複数ブランチを頻繁に切り替える
- モノレポ構成で複数サービスを管理している
Gitは差分管理が得意とはいえ、vendorの更新頻度が高いと履歴も膨れ上がります。
差分レビューが実質不可能
vendorディレクトリを含めると、Pull Requestに大量の差分が表示されます。
しかしその差分は、ほとんどの開発者にとって「読めない」「読む意味がない」ものです。
結果として、
- レビューが形骸化する
- 本来レビューすべき自分たちのコードが埋もれる
- マージ判断が雑になる
といった副作用が起きがちです。
依存関係はlockファイルで管理できる
多くのエコシステムでは、依存関係をlockファイルで固定できます。
- composer.lock
- go.sum
- Gemfile.lock
- package-lock.json / pnpm-lock.yaml など
これらがあれば、vendorディレクトリを含めなくても、同じ依存関係を再現できる設計になっています。この前提がある限り、vendorをGitに含める必要性は低くなります。
それでもGit管理したくなる現実的な理由
理屈では「Git管理しない」が正しくても、現実はそう単純ではありません。
ネットワークに依存したくない
ビルドやデプロイのたびに外部レジストリへアクセスする構成は、以下のリスクを抱えます。
- レジストリ障害でビルド不能
- 社内ネットワーク制限で取得不可
- 過去バージョンが突然取得できなくなる
特にオンプレミス環境や閉域ネットワークでは、vendorを含めることで運用が安定するケースがあります。
長期保守・再現性を最優先したい
数年単位で保守するシステムでは、「当時の依存関係が将来も取得できるか」が不透明です。
lockファイルがあっても、配布元が消滅すれば再現は困難になります。
この場合、「その時点で動いていた依存コードを丸ごと残す」という発想は、決して間違いではありません。
言語・ツールの成熟度が低い場合
エコシステムが成熟していない場合、依存解決が不安定なことがあります。
- lockファイルが完全ではない
- 同一lockでも結果が変わる
- プラットフォーム差異が大きい
こうした状況では、vendorをGit管理した方がトラブルが減ることもあります。
実際にやるとこうなる、失敗しがちなパターン
vendorディレクトリをGit管理して起きがちな失敗も知っておく必要があります。
「とりあえず入れた」が後で足かせになる
初期構築時に勢いでvendorを含めると、後から外すのが非常に面倒になります。
- 履歴に巨大なコミットが残る
- ignore設定を変えても過去は消えない
- チーム内で認識が割れる
結果として、「やめたいけどやめられない」状態に陥りがちです。
CI/CDが想定以上に遅くなる
vendorを含めたリポジトリは、clone時間が伸びます。
CIの実行時間が積み上がると、開発体験に直接影響します。
「依存を毎回installするのと、cloneが遅いのと、どちらがマシか」を冷静に比較しないと、逆効果になることもあります。
判断のためのチェックポイント
vendorディレクトリをGit管理するか迷ったときは、次の観点で整理すると判断しやすくなります。
- 依存関係はlockファイルで安定して再現できるか
- 外部レジストリにどれくらい依存しているか
- ビルドやデプロイはオンライン前提か
- リポジトリサイズ増加を許容できるか
- 数年後に同じ構成を再現する必要があるか
これらに「はい」が多いほど、vendorをGit管理しない判断が自然になります。一方、「いいえ」が多い場合は、vendor管理も選択肢に入ってきます。
代替案という折衷案
Git管理する/しないの二択ではなく、折衷案も存在します。
内部レジストリを立てる
npmやComposer、Go Modulesなどを社内ミラーで運用すれば、外部依存の不安はかなり減ります。
vendorを含めず、かつ再現性も確保しやすい方法です。
アーティファクトとして保存する
vendorディレクトリをGitではなく、ビルド成果物として保存する方法もあります。
リリース時点の依存関係をアーカイブしておくことで、必要なときだけ参照できます。
少しひねったまとめ
vendorディレクトリをGit管理すべきかどうかは、「正解を選ぶ問題」ではなく「どの不便を受け入れるかを選ぶ問題」です。
Git管理しなければ、外部依存や環境差異と向き合う必要があります。
Git管理すれば、リポジトリの重さや運用コストを受け入れる必要があります。
どちらかを完全に避けることはできません。
だからこそ、「自分たちのプロジェクトでは何が一番困るのか」を基準に判断することが、vendorディレクトリ問題で後悔しないための近道だと言えるでしょう。