マージリクエストの依存関係
マージリクエストの依存関係によって、マージリクエスト間のマージ順序を表現することができます。 あるマージリクエストが別のマージリクエストに “依存する” 場合、その依存関係がマージされるまでマージすることはできません。
ユースケース
- ライブラリの変更が、ライブラリをインポートするプロジェクトの変更の前にマージされるようにします。
- ドキュメント化される機能を実装するマージリクエストの前に、ドキュメント化のみのマージリクエストがマージされないようにします。
- まだ権限が付与されていない人からのマージリクエストをマージする前に、権限マトリックスを更新するマージリクエストをマージする必要があります。
ひとつの論理的な変更が、複数のプロジェクトにまたがる複数のマージリクエストにまたがることはよくあることで、マージされる順番は重要な意味を持ちます。
たとえば、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
で新しいマージリクエストを作成するときに依存関係を設定することができます (またはすでに存在する場合は編集します)。 依存関係は依存するマージリクエストで設定する必要があります。 フォームにマージリクエスト依存関係セクションがあります:
マージリクエストを編集できる人は誰でも依存関係のリストを変更できます。
新しい依存関係は、参照または URL によって追加できます。 依存関係を削除するには、その参照の横にあるXキーを押します。
依存関係はプロジェクト間で指定できるため、あなたがアクセスできないプロジェクトのマージリクエストに対して、他の誰かが依存関係を追加している可能性があります。 これらは単純なカウントとして表示されます:
必要であれば、1つの目に見える依存関係を削除するのと同じように、Xを押すことでこのようにすべての依存関係を削除することができます。
変更が完了したら、[変更を保存] ボタンを押してリクエストを送信するか、[キャンセル]ボタンを押して変更せずに戻ります。
設定された依存関係のリストとそれぞれのステータスはマージリクエストウィジェットに表示されます:
すべての依存関係がマージされるまで、依存関係のあるマージリクエストのマージボタンは無効になります。 特に、クローズされたマージリクエストは依存関係がマージされないようにすることに注意してください - クローズされたマージリクエストで表現された依存関係が他の方法で満たされたかどうかを自動的に判断することはできません。
マージリクエストがクローズされ、依存関係がもはや関係ない場合、マージする前に、上記の指示に従って依存関係として削除する必要があります。
制限事項
- APIサポート: イシュー#12551
- プロジェクトのエクスポート/インポート時に依存関係が保持されない: イシュー#12549
- 複雑なマージ順序依存関係はサポートされていません: イシュー#11393
最後の項目はもう少し説明が必要です。 マージリクエスト間の依存関係は関係のグラフとして記述することができます。 最も単純なグラフは、あるマージリクエストが別のマージリクエストに依存するというものです:
より複雑な(そしてまだサポートされている)グラフには、いくつかの他のものに直接依存するマージリクエストがあるかもしれません:
複数の異なるマージリクエストは、同じマージリクエストに直接依存することもできます:
サポートされていないのは、依存関係の “深い”、つまり “入れ子 “のグラフです。 例えば、以下のようなものです:
この例では、myfriend/awesome-lib!10
はherfriend/another-lib!1
に依存し、それ自身はmycorp/awesome-project!100
の従属です。これはmyfriend/awesome-lib!10
がmycorp/awesome-project!100
の間接的な従属になることを意味します。