「ベンダーブランチ」に関しては、サブモジュールが適していると思います。
submod の使用方法は次のとおりです... うーん、冗談です。
ちょっとした考え; あなたがしたい:
- メインプロジェクトとサブプロジェクトの両方を同じディレクトリ内で開発する (これは「システムアプローチ」と呼ばれます: すべてのシステムを開発、タグ付け、マージします)
- または、サブプロジェクトを「ベンダー ブランチ」(ベンダー外部コンポーネントの明確に定義されたバージョン、または「ファイルのセット」にアクセスできるようにするブランチ) として表示し、新しいものでのみ更新されます。その外部コンポーネントのリリースごとにバージョンを変更します。これは「コンポーネントアプローチ」と呼ばれ、すべてのシステムは、独自に開発された個別のコンポーネントのコレクションと見なされます)
2 つのアプローチには互換性がありません。
- 最初の戦略は、サブツリー マージと互換性があります。プロジェクトとサブプロジェクトの両方で作業しています。
- 2 つ目はサブモジュールで使用されますが、サブモジュールは構成(作業する必要があるタグのリスト) を定義するために使用されます: 各 git サブモジュールは、svn:externals とは異なり、特定のコミット ID に固定されています。構成を定義する(S C M のように: 「ソフトウェア構成管理」)
ほとんどの場合、プロジェクトとサブプロジェクトがある場合、それらのライフサイクルは異なります (同じリズムで開発されていない、同時にタグ付けされていない、同じ名前ではない)ため、2 番目のアプローチが好きです。.
あなたの質問でそのアプローチ(「コンポーネントベース」)を本当に妨げているのは、「同じ作業ディレクトリから両方を開発および更新できる」部分です。
ほとんどの IDE は複数の「ソース」ディレクトリを完全に処理でき、サブプロジェクトの開発は独自の専用環境で実行できるため、その要件を再考することを強くお勧めします。
samgoody は次のように付け加えます。
Joomla と ModX の両方の eMap プラグインを想像してみてください。プラグインと Joomla 固有のコード (eMap ではなく Joomla の一部) は、プラグインが Joomla 内にある間に開発されます。すべてのパスは相対的であり、構造は厳密であり、プロジェクトごとに独自のライフサイクルがありますが、一緒に配布する必要があります。
私の理解が正しければ、開発環境 (作業中のファイルのセット) が配布環境とまったく同じ構成になっています (同じファイルのセットがリリース プラットフォームにコピーされます)。
それはすべて、粒度の問題で行われます。
- 両方のファイルのセットが存在しない場合、それらは 1 つの大きなプロジェクト (およびサブツリー マージ) として表示する必要がありますが、タグを付けて 1 つにマージする必要があります。-一方が他方に依存している場合(単独で開発できる場合)、それらは独自のGitリポジトリとプロジェクトにある必要があり、最初のものはサブモジュールとして2番目の特定のコミットに依存します:サブモジュールが最初のコンポーネントの右側のサブツリーで定義されている場合、すべての相対パスが考慮されます。
samgoody は次のように付け加えます。
元のスレッドには、サブモジュールに関する問題がリストされていました。主に、GitHub のダウンロードにはサブモジュールが含まれておらず (私にとっては重要です)、特定のコミットでスタックしてしまうことです。
GitHub のダウンロードが最近問題になっているかどうかはわかりません。その「ガイド: サブモジュールを使用した開発」の記事では、次のことが言及されています。
何よりも、サブモジュールのパブリック クローン URL を登録しているため、フォークのクローンを作成する人がサブモジュールをmy-awesome-framework
問題なくプルダウンできます。my-fantastic-plugin
コマンド
$ gh submodule init
$ gh submodule update
サブモジュールを現在のリポジトリにプルします。
「彼らは特定のコミットで行き詰まる」に関しては、それがサブモジュールのすべてのポイントであり、最新の潜在的に不安定なファイルのセットではなく、構成(コンポーネントのタグ付きバージョンのリスト) を操作できるようにします。
samgoody は次のように述べています。
サブツリーとサブモジュールの両方を避ける必要があり (質問を参照)、アプローチが正当化される場合は、あまり議論せずにこの必要性に対処したいと思います。
あなたの要件は完全に正当なものであり、その正当性を判断したくありません。以前の回答は、より大きなコンテキストを提供し、一般的な SCM ツールで通常使用できるオプションを説明するためにのみここに記載されています。
サブツリーのマージがここでの答えになるはずですが、メイン プロジェクトのファイルに対して作成されたコミットのみをマージし、サブプロジェクトに対して作成されたコミットはマージしないことを意味します。そのような部分的なマージを管理できる場合は、それが正しい道だと思います。
ただし、subtree-merge または submodule を使用しないネイティブ Git の方法は見当たりません。
真の Git の第一人者が、より適切な回答をここに投稿してくれることを願っています。