web-dev-qa-db-ja.com

Gitのベンダーブランチ

Gitプロジェクトには、コンテンツが独立して取り組んでいる2番目のプロジェクトが含まれています。

ユーザーが「親」のクローンを作成またはダウンロードしようとすると、サブプロジェクトも含める必要があるため、サブモジュールを小さいものに使用することはできません。

サブプロジェクトは活発に開発されているため、サブツリーのマージは使用できません。サブツリーのマージでは、これらの更新を元のプロジェクトにマージすることが非常に困難になります。

このソリューションはSVNの世界では「ベンダーブランチ」として知られており、Gitで簡単に実行できるため、アドレス指定も不要であるとのことです。中途半端なチュートリアルがネット上にたくさんあります。

それにもかかわらず、私はそれを機能させることができないようです。

誰かが(かなりお願いしますか?)あるプロジェクトが別のプロジェクト内に存在し、両方が同じ作業ディレクトリから開発および更新できる構造を作成する方法を説明できますか?理想的には[または、サポートされていない場合は、クライアントが「親」プロジェクトをダウンロードしようとするときに、最新バージョンを提供することが非常に重要です。 -)サブプロジェクトの自動的に。

サブモジュールやサブツリーマージ、さらにはSVN:Externalsの使用方法を説明しないでください。このスレッドは 次のSOスレッド の派生物です。何かが欠けている場合は、投稿してくださいthere。このスレッドは、ベンダーブランチの方法を理解しようとしています。そして、より長く、より明確で、よりダミーの説明を受け取ると、私はより幸せになります。

28
SamGoody

「ベンダーブランチ」に関しては、サブモジュールが進むべき道だと思います。
これがsubmodの使い方です...うーん、冗談です。

ちょっとした考え;あなたが欲しい:

  • 同じディレクトリ内でメインプロジェクトとサブプロジェクトの両方を開発するには(「システムアプローチ」と呼ばれます:すべてのシステムを開発、タグ付け、マージします)
  • または、サブプロジェクトを「ベンダーブランチ」(ベンダー外部コンポーネントの明確に定義されたバージョン(または「ファイルのセット」)にアクセスできるブランチであり、新しいものでのみ更新されるブランチ)として表示します。その外部コンポーネントのリリースごとのバージョン:「component-approach」と呼ばれる、すべてのシステムは、それらで開発された個別のコンポーネントのコレクションと見なされます自分の)

2つのアプローチには互換性がありません。

  • 最初の戦略はサブツリーマージと互換性があります。プロジェクトとサブプロジェクトの両方で作業しています。
  • 2番目のものはサブモジュールで使用されますが、サブモジュールは構成(作業する必要のあるタグのリスト)を定義するために使用されます:svnとは異なり、各gitサブモジュール: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の第一人者がここにもっと適切な答えを投稿してくれることを願っています。

35
VonC

山に戻る前に、ようやくネットに数時間アクセスできるようになりました。あなたの状況を明確にするために何か貢献できることがあるかどうかを確認します。

私の(おそらく過度に単純化された)理解は、(社内の)チームが外部ソースのフレームワークを使用してメインプロジェクトのコードを開発しているプロジェクトのプラグインを開発している(オフサイトの)ベンダーがあるということです。ベンダーはコードに変更を加えず、おそらく最先端の開発を必要としませんが、作業を開発およびテストするために安定したコードを必要とします。チームはフレームワークに変更を加えませんが、プラグインに変更を加える場合があります。

  1. VonC(通常は物事を非常に徹底的に考える)のように、Gitはあなたの要件に完璧適合していないと思います。そして彼のように、サブツリーのマージパターンを使用するのが最も適していると思います。私はGitの第一人者ではありませんが、Gitを幅広いニーズに合わせて曲げることに成功しています。たぶんGitはあなたのニーズを満たしていません:

    • SVNを使用すると、1つの中に複数のリポジトリを作成できます。これはあなたにとって重要と思われます。これは、外観またはベンダーブランチパターンを使用して、必要なものに近づけることを意味すると思います。

    • Mercurialには、ネストされたリポジトリを使用するための拡張機能 Forest、 があります。これは、メンタルモデルにより適しているようです。 15か月前にMercurialではなくGitを選択しましたが、HGは安定しており、多くの用途でGitに匹敵すると思います。拡張機能がどれほど安定しているかわかりません。

  2. 私があなたの状況にあった場合、2つのGitリポジトリを使用します。1つはプラグイン用、もう1つはMainProject用です。ベンダーはプラグインリポジトリで開発を行い、残りの開発環境なしでプラグインの現在のバージョンをプルするリリースブランチを持ちます。そのブランチは、ベンダーブランチとしてMainProjectリポジトリにプルされてから、メインの開発ブランチにマージされます。 チームがプラグインの変更に取り組むとき、チームはプラグインをメインの開発ブランチから離れた機能ブランチで開発し、パッチとしてベンダーリポジトリに送信します。これにより、開発履歴を分離したまま、非常にクリーンなワークフローを実現し、セットアップと学習が比較的簡単になります。

    私は議論をするつもりはありませんが、単にこれがあなたの状況を理解するのに最も適していると言ってください。これを設定する最も簡単な方法は、サブツリーマージを使用することですが、これは両方向に変更を実行しません。これは、そのパターンを使用することに反対しました。

  3. チームがプラグイン開発に本当に積極的に関与している場合、またはプロジェクトとプラグインの両方の開発履歴を1つのGitリポジトリに統合したい場合は、1つのGitリポジトリを使用してください。ベンダーのレコードのプラグインとその履歴を ここで説明 として抽出できます。これにより、意図したよりもカプセル化が少なくなる可能性がありますが、Gitはカプセル化用に設計されていません。Gitのデータ構造は、1つのプロジェクト全体内の変更の追跡に基づいています。

多分私はあなたの状況を誤解しました、そしてこれのどれも当てはまりません。もしそうなら、私はお詫び申し上げます。あなたとVonCが解決した詳細に感謝します。これは、私が最初にあなたの質問を理解しようとしていた多くの穴を埋めました。

8
Paul

元の質問のタイトルだけを探す場合:

gitを使用したベンダーブランチパターンの適切なテンプレートがオンになっています

https://www.roe.ch/Git_Reference

セクションベンダーブランチパターン

0
weberjn