Herr Doktor、
あなたはリンゴとオレンジを比較しています。git-submodulesは、 svn:externals、別名svn-submodulesに似ています。実際、を使用し-r
て特定のリビジョンでsvnサブモジュールをアタッチする場合、動作はほぼ同じです。svn-submodulesでコミットするには、git-submodulesの場合と同様に、各サブモジュールディレクトリで個別にコミットする必要があります。
ただし、大きな違いがあります。ほとんどの開発者は、少なくとも開発のある段階では、git-submodulesでサポートされていない各サブモジュールのブランチに接続することを好みます。これは、調整された開発に役立ちます。(GoogleのRepoツールはGitのラッパーであり、コードレビューツールであるGerritで使用するためのものですが、私を信じてください:Repoに近づかないでください。別の問題を解決します。)大きな欠点は、回復できないことです。コードベースの正確な輪郭。それはしばらくの間は問題ないようですが、私は厄介な戦争の話を聞いたことがあります。
代わりの方法はSubversionではなく、Git、Subversionなどにある単一のリポジトリです。しかし、実際には、単一のリポジトリと複数のリポジトリの組み合わせが必要ですよね?それぞれのメリットが必要です。したがって、より洗練されたソリューションが必要です。
1つのアイデアは、開発の大部分を行う1つのプロジェクトリポジトリと、モジュールを配布するいくつかの個別のリポジトリを用意することです。
proj/.git
proj/subA
proj/subB
subA/.git
subB/.git
rsyncを使用してそれらの間でコードを移動できます。美しさは、開発と配布を明確に区別したことです。ブランチやマージなどを使用して、通常どおり大規模なプロジェクトを開発します。サブディレクトリをライブラリとして配布する準備ができたら、必要なライブラリのバージョンを正確に決定し、それを独自のリポジトリにコピーします。単にコピーするのではなくマージする必要がある場合は、gitサブツリーマージ戦略があります。
サブツリーマージ戦略の上に構築された別のシステムがあります。これはgit-subtreesと呼ばれ、 git-1.7.11の一部です。これがその動作の良い説明です。写真から、そのタイムラインが混乱しているように見えることがわかりますが、機能的にはまさにあなたが望むものです。これが最近の記事で、優れたアドバイスがあります。
git-submodulesの余分な「更新」ステップを気にしないが、競合の処理方法に腹を立てている場合は、giternalを試すことができます。作成者は、その動作がgit-submodulesおよびbraid(サブモジュールを販売するためのものですが、それらをマージするためのものではありません)とどのように比較されるかを示すスクリプトを含めました。
個人的には、gitの単純なラッパーであるgit-slaveが好きです。基本的に、コマンドをすべてのリポジトリにgits
コマンドとして適用します。git
それは本当に便利です。非常に理解しやすく、個々のリポジトリに影響を与えることはなく、ブランチの切り替えに最適です(git-subtreesではまだサポートされていません)。