コードベースの SCM を設計するのに助けが必要です。コードベースはかなり複雑なので、最初に説明します。
コードベースは、簡単にするために、多くの異なる製品のコードで構成されていますProduct1
(Product2
実際にはもっと多くの製品があります)。それぞれProduct
に複数のソフトウェアがProjects
関連付けられています。たとえば、 、およびアプリCore Application
などのサポート ソフトウェアがあります (これは製品によって異なります)。それぞれが共通のコードを使用する必要があります(つまり、、およびアプリケーションはすべて共通のコードを共有する必要があります)。さらに、社内ライブラリを相互に共有する必要があります。iOS
Android
Project
Product
Core
iOS
Android
Products
事実上、次のような構造になります。
Library1
Library2
Product1
├── Common
├── Core Application
├── iOS
└── Android
Product2
├── Common
├── Core Application
├── iOS
└── Android
次の機能は絶対に必要です。
- プロジェクトの最小限のコード セットをチェックアウトする機能 - たとえば、
Product1's
Android
アプリケーションをビルドする場合、、、、、のみをチェックアウトLibrary1
します。コードベースが非常に広大であるため、すべてをチェックアウトするには膨大な時間がかかりますLibrary2
Product1/Common
Product1/Android
- 共有ライブラリ、共通コード、プロジェクト コードの状態を特定のリビジョンに戻す - たとえば
Product2's
Core Application
、バグをテストするために 2 か月前と同じようにビルドする必要があり、 が必要でLibrary1
、Library2
すべて同じリビジョンに戻す必要があります。Product2/Common
Product2/Core Application
- 履歴を維持しながら、ファイルを別の共有フォルダーに移動する - 最初にすべての a の正しいコードをフォルダーに入れることは不可能
Product
ですCommon
。時間の経過とともに要件が変化し、新しい製品が要求されます。つまり、かつて存在していたコードは、または場合によってProduct2/Core Application
は に移動する必要があります。Product2/Common
Library2
現在、私たちが使用しているシステムは巨大な SVN リポジトリであり、すべてのProducts
、Projects
およびLibraries
. SVN では選択的なコード チェックアウトが可能であるため、特定のフォルダーのみをチェックアウトすることを選択できます。すべてが 1 つのリポジトリであるため、すべてが同じリビジョンにうまく戻ります。分岐またはタグ付けするときは、リポジトリ全体に分岐/タグ付けします!
私が望むのは、コード ベースを適切にモジュール化することです。たとえば、Library1
独自のリポジトリに存在し、他のリポジトリに単純に含まれるようにします。svn::externals
これは要件 2 に違反するため、 では実際には不可能です。
次の理由から、何らかの形式の DVCS を使用したいと思います。
- パフォーマンス - 大きな変更セットをコミットすると SVN が遅くなる
- Braching/Merging - 大きな SVN ブランチをマージしようとするのは悪夢です。DVCS を使用すると、はるかに簡単になります。
- モジュールの適切なサポート。Git にはサブモジュールがあり、Mercurial にはサブリポジトリがあり、これは私の設計目標に合っているようですが、両方とも、リビジョンを変更するときにサブリポジトリを手動で更新する必要があるようです。簡単な1ステップで済ませたい。
- より明確なリポジトリ構造。サブリポジトリを使用すると、各プロジェクトは明確な構造と明確な依存関係を持つ独自のリポジトリになります。
何か案は?