GitのSubmodulesとは何かを調べたメモを書く。
https://git-scm.com/book/en/v2/Git-Tools-Submodules
Git Submoduleとは
GitのSubmoduleは、Gitリポジトリに別のGitリポジトリを含める機能。 submoduleはリポジトリなので、個別にバージョン管理が可能になる。
Git Submodulesは何が嬉しいのか
Pythonを使ってるとGitリポジトリから直接インストールできる。 なので、Submoduleにする必要性をあまり感じたことがない。 それを踏まえ、もう少し検討してみた。
フレームワークを保守していて、それをプロダクトで使っている場合は、Submodulesが嬉しように思う。 フレームワークの場合、一つの修正を入れるために複数の箇所を修正することになるのはあり得る。
その他、ChatGPTと議論しながらいくつか考えてみた。しかし、大規模で複数のチームが混在しており、また、複数のプロダクトも存在するような状況でなければ、GitSubmodulesが有効な場面が想像できなかった。
以下にChatGPTとの検討のまとめを貼っておく。(ChatGPTにまとめさせたものを調整している。)
Git Submodulesの有効な使用シーン
-
共有ライブラリの管理: プロジェクトが独自に開発した共有ライブラリを、複数のプロジェクトで再利用したい場合。パッケージマネージャーで直接管理できないような独自のコードを、各プロジェクトで一貫して利用できる。
-
マイクロサービスアーキテクチャ: マイクロサービスをそれぞれ独立したリポジトリで管理し、それら全てを参照する親リポジトリを作ることで、全体の一覧性や管理性を向上させられる。
-
大規模なプロジェクトの分割: 大規模なプロジェクトを複数の部分(モジュールやコンポーネント)に分割し、それぞれを独立したリポジトリとして管理する場合。各部分の開発がより独立性を持たせられる。
Git Submodulesのメリットとデメリット
メリット
-
コードの再利用: 共通のコードを再利用したい複数のプロジェクト間でコードを共有できる。これにより、同じコードの複製を避けられる。
-
独立性: 各サブモジュールは自身のリポジトリを持ち、独立に開発・メンテナンスできる。これは大規模なプロジェクトや複数のチームが関与する場合に特に有用。
-
特定のバージョンの追跡: 親リポジトリは子リポジトリの特定のバージョンを参照できる。特定のバージョンのコードを追跡することができ、親リポジトリの安定性を保てる。
デメリット
-
複雑性: Git Submodulesの管理は少々複雑であり、初めて使う人にとっては理解するのが難しい。サブモジュールの更新、ブランチの管理、コンフリクトの解決など、特殊な手順を必要とする。
-
更新の手間: 親リポジトリはサブモジュールの特定のバージョンを追跡するため、サブモジュールの新しいバージョンを使用するには、親リポジトリを明示的に更新する必要がある。
-
混乱の可能性: Git Submodulesを知らない人がリポジトリをクローンした場合、彼らはサブモジュールの存在に気づかず、空のディレクトリを見つけることになる。これは混乱を招くことがある。