web-dev-qa-db-ja.com

Gitサブモジュールまたはサブリポジトリまたはリモート?

私はGITを使用してコンテンツ管理システム(CMS)プロジェクトを管理しています。 CMSは複数のプラグイン(モジュール)を持つことができます。

つまり、基本的に、3種類のリポジトリが必要です。

  • コアCMS開発(すべての新しいプロジェクトは、その最後の安定した未構成バージョンのチェックアウトです)
  • モジュール/プラグインごとに1つのリポジトリ。 (すべての新しいプロジェクトは、実装したいモジュールの最後の安定バージョンをチェックアウトします)
  • プロジェクトごとに1つのリポジトリ(各クライアントは、コアCMSおよびモジュールからのパーソナライズを表すリポジトリになります)

タイプ1と2の場合、これは単純な基本リポジトリだと思います。しかし、クライアントプロジェクトになると、私は混乱します。

  • 最初にCMSのクローンを作成し、次に/ modules /フォルダーに移動して、必要なすべてのモジュールのクローンを再度作成しますか?これにより、リポジトリ内にリポジトリが作成されます。最初のリポジトリは、各モジュールの.git /フォルダーをログに記録しようとしますか?
  • 各クライアントはモジュールをパーソナライズする必要があるため、サブモジュールを使用できません。
  • モジュールのコアコンポーネントを変更した場合(パーソナライズではなく、バグ修正のみ)、その単一のファイルを元のモジュールリポジトリにプッシュできますか?
  • (全体に広がるモジュールunitTestについては話していません)

だから問題は:効率的にするためにリポジトリ/ファイル/フォルダをどのように整理する必要がありますか?

25
FMaz008

あなたが説明したレイアウトは、gitサブモジュールで本当にうまく機能します。 docs を読んで、いくつか試してみることをお勧めします tutorials 。計画で導入される主な違いは、各クライアントリポジトリとクライアントプラグインリポジトリには、1つではなく2つのリモートがあることです。そして、あなたが新しいクライアントプロジェクトを始めたいとき、あなたはする必要があるでしょう

  1. メインラインのcmsをフォークする
  2. 変更されるすべてのプラグインをフォークします
  3. (1)からフォークされたcmsのクローンを作成し、そのサブモジュールを更新して(2)からの新しいリモートを指すようにします。
  4. サブモジュールを初期化/更新します
  5. (オプション)メインラインのcmsURLをクライアントのフォークされたcmsにリモートとして追加します
  6. (オプション)メインラインプラグインのURLをクライアントのフォークされたプラグインのリモートとして追加します

より良いオプションは、同じリポジトリを使用して、クライアントごとにブランチを作成することです。それが私がそれをする方法です。

13
John Douthat

前の回答に関する短い更新/追加情報:git submodulesアプローチが気に入らない場合、またはこれが理解しにくいと思われる場合は、試してみてください。

サブモジュールの代わりに別の依存関係マネージャー(RubyのRubyGems、PHPのComposer ...)など)を使用できるかどうかを確認することを忘れないでください。使用と保守が簡単になります。

8
Maxime Brehin