マージリクエストの依存関係

マージリクエストの依存関係によって、マージリクエスト間のマージ順序を表現することができます。 あるマージリクエストが別のマージリクエストに “依存する” 場合、その依存関係がマージされるまでマージすることはできません。

注:マージリクエストの依存関係はPREMIUMの機能ですが、この制限は依存するマージリクエストに対してのみ適用されます。COREまたはStarterプロジェクトのマージリクエストはPREMIUMマージリクエストの依存関係になることができますが、その逆はできません。

ユースケース

  • ライブラリの変更が、ライブラリをインポートするプロジェクトの変更の前にマージされるようにします。
  • ドキュメント化される機能を実装するマージリクエストの前に、ドキュメント化のみのマージリクエストがマージされないようにします。
  • まだ権限が付与されていない人からのマージリクエストをマージする前に、権限マトリックスを更新するマージリクエストをマージする必要があります。

ひとつの論理的な変更が、複数のプロジェクトにまたがる複数のマージリクエストにまたがることはよくあることで、マージされる順番は重要な意味を持ちます。

たとえば、myfriend/awesome-libでライブラリをインポートしているプロジェクトmycorp/awesome-project があるとして、awesome-project で機能を追加するには、awesome-libにも変更を加える必要があるかもしれません。そのため、2つのマージリクエストが必要になります。awesome-lib のマージリクエストの前に、awesome-project のマージリクエストをマージすると、masterブランチが壊れてしまいます。

awesome-project のマージリクエストをWIPとしてマークし、WIPの理由をコメントに含めることができます。しかし、これはawesome-lib のマージリクエストの状態を手動で追跡する必要があり、awesome-project のマージリクエストが他のいくつかのプロジェクトの変更に依存している場合、うまくスケールしません。

awesome-project のマージリクエストをawesome-lib のマージリクエストに依存するようにすることで、この関係は GitLab によって自動的に追跡され、WIP の状態を個々のマージリクエストのコードの準備状況を伝えるために使うことができます。

設定

上記の例を続けるために、awesome-project で新しいマージリクエストを作成するときに依存関係を設定することができます (またはすでに存在する場合は編集します)。 依存関係は依存するマージリクエストで設定する必要があります。 フォームにマージリクエスト依存関係セクションがあります:

Merge request dependencies form control

マージリクエストを編集できる人は誰でも依存関係のリストを変更できます。

新しい依存関係は、参照または URL によって追加できます。 依存関係を削除するには、その参照の横にあるXキーを押します。

依存関係はプロジェクト間で指定できるため、あなたがアクセスできないプロジェクトのマージリクエストに対して、他の誰かが依存関係を追加している可能性があります。 これらは単純なカウントとして表示されます:

Merge request dependencies form control with inaccessible merge requests

必要であれば、1つの目に見える依存関係を削除するのと同じように、Xを押すことでこのようにすべての依存関係を削除することができます。

変更が完了したら、[変更を保存] ボタンを押してリクエストを送信するか、[キャンセル]ボタンを押して変更せずに戻ります。

設定された依存関係のリストとそれぞれのステータスはマージリクエストウィジェットに表示されます:

Dependencies in merge request widget

すべての依存関係がマージされるまで、依存関係のあるマージリクエストのマージボタンは無効になります。 特に、クローズされたマージリクエストは依存関係がマージされないようにすることに注意してください - クローズされたマージリクエストで表現された依存関係が他の方法で満たされたかどうかを自動的に判断することはできません。

マージリクエストがクローズされ、依存関係がもはや関係ない場合、マージする前に、上記の指示に従って依存関係として削除する必要があります。

制限事項

  • APIサポート: イシュー#12551
  • プロジェクトのエクスポート/インポート時に依存関係が保持されない: イシュー#12549
  • 複雑なマージ順序依存関係はサポートされていません: イシュー#11393

最後の項目はもう少し説明が必要です。 マージリクエスト間の依存関係は関係のグラフとして記述することができます。 最も単純なグラフは、あるマージリクエストが別のマージリクエストに依存するというものです:

graph LR; myfriend/awesome-lib!10-->mycorp/awesome-project!100;

より複雑な(そしてまだサポートされている)グラフには、いくつかの他のものに直接依存するマージリクエストがあるかもしれません:

graph LR; myfriend/awesome-lib!10-->mycorp/awesome-project!100; herfriend/another-lib!1-->mycorp/awesome-project!100;

複数の異なるマージリクエストは、同じマージリクエストに直接依存することもできます:

graph LR; herfriend/another-lib!1-->myfriend/awesome-lib!10; herfriend/another-lib!1-->mycorp/awesome-project!100;

サポートされていないのは、依存関係の “深い”、つまり “入れ子 “のグラフです。 例えば、以下のようなものです:

graph LR; herfriend/another-lib!1-->myfriend/awesome-lib!10; myfriend/awesome-lib!10-->mycorp/awesome-project!100;

この例では、myfriend/awesome-lib!10herfriend/another-lib!1に依存し、それ自身はmycorp/awesome-project!100の従属です。これはmyfriend/awesome-lib!10mycorp/awesome-project!100間接的な従属になることを意味します。