保護されたブランチ

GitLabでは、権限は基本的にリポジトリやブランチへの読み込みや書き込みの権限を中心に定義されます。特定のブランチをさらに制限するために、ブランチを保護することができます。

保護されたブランチは、次のような制御を行います:

  • ブランチにマージできるユーザー。
  • ブランチにプッシュできるユーザー。
  • ブランチに強制プッシュできるユーザー。
  • CODEOWNERS ファイルにあるファイルへの変更を、ブランチに直接プッシュできるかどうか。
  • ブランチの保護を解除できるユーザー。

リポジトリのデフォルトブランチは、デフォルトで保護されています。

保護されたブランチを変更できる人

ブランチのプッシュ権限は、GitLab 16.0ではGitLab管理者も許可権限を持つ必要があるように変更されました。

ブランチが保護されている場合、デフォルトの動作ではブランチにこれらの制限が適用されます。

アクション誰ができるか
ブランチを守る少なくともメンテナーのロール。
ブランチにプッシュしてください。 権限があれば誰でも(1)
ブランチへの強制プッシュ誰も(3)
ブランチ削除誰も(2)
  1. 開発者ロールを持つユーザーは、グループ内でプロジェクトを作成することはできますが、デフォルトブランチへの最初のプッシュは許可されないかもしれません。
  2. Git コマンドで保護ブランチを削除することはできません。しかし、少なくともメンテナーのロールを持つユーザーは、UI や API から保護ブランチを削除することができます。
  3. group_protected_branches 機能フラグが有効_で、_同じブランチがグループとプロジェクトの両方のレベルで保護されている場合、そのブランチに対してプロジェクトレベルで設定された強制プッシュの設定は無視されます。他のすべての保護は、プロジェクトレベルの設定を使い続けます。

ブランチが複数のルールにマッチする場合

ブランチが複数のルールに一致する場合、最も権限の強いルールによって、ブランチの保護レベルが決まります。たとえば、ワイルドカードを含む次のルールを考えてみましょう:

ブランチ名パターンマージ許可プッシュとマージの許可
v1.xメンテナーメンテナー
v1.*メンテナー+開発者メンテナー
v*誰も誰も

という名前のブランチは、v1.x 3つのブランチ名パターンすべてにマッチ v1.xします:,v1.*, およびv* にマッチします。最も寛容なオプションが動作を決定するので、ブランチv1.x の権限は次のようになります:

  • マージを許可します:3つの設定のうち、Maintainer + Developer がもっとも寛容で、結果としてブランチの挙動を制御します。このブランチがv1.xv* (それぞれより厳しいパーミッションを持っています) にもマッチしていたとしても、開発者ロールを持つユーザーはこのブランチにマージすることができます。
  • プッシュとマージを許可します:この 3 つの設定のうちMaintainer がもっとも権限が強く、ブランチの挙動を制御します。v* にマッチしたブランチはNo one に設定されますが_、_ v1.xv1.* にマッチしたブランチには、より寛容なMaintainer 権限が与えられます。

あるルールがブランチの動作を制御していることを確認するには、マッチする他の_すべての_パターンに、より寛容度の低い、または同等のルールを適用する必要があります。

ブランチへのプッシュをNo one に確実に許可したい場合、マッチするv1.xすべての v1.xパターンはAllowed to push and mergeNo one に設定しなければなりません:

ブランチ名パターンマージ許可プッシュとマージの許可
v1.xメンテナー誰も
v1.*メンテナー+開発者誰も
v*誰も誰も

デフォルトのブランチ保護レベルの設定

管理者は、管理エリアでデフォルトのブランチ保護レベルを設定できます。

既存のブランチに保護を追加

グループ内のすべてのプロジェクト、またはプロジェクトだけに保護ブランチを設定できます。

一つのプロジェクトに対して

前提条件:

  • 少なくともメンテナーのロールを持っている必要があります。
  • グループにAllowed to merge(マージ許可)またはAllowed to push and merge(プッシュとマージを許可)の権限を保護されたブランチで与える場合、そのグループをプロジェクトに追加する必要があります。

ブランチを保護するには

  1. 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
  2. 設定] > [リポジトリ]を選択します。
  3. 保護されたブランチを展開します。
  4. 保護されたブランチを追加] を選択します。
  5. ブランチ] ドロップダウンリストから、保護するブランチを選択します。
  6. Allowed to mergeリストから、このブランチにマージできるロールを選択します。
  7. プッシュとマージを許可するリストから、このブランチにプッシュできるロールを選択します。

    note
    GitLab Premium と Ultimate では、グループや個々のユーザーをAllowed to mergeAllowed to push and merge に追加することもできます。
  8. 保護]を選択します。

保護されたブランチが保護されたブランチのリストに表示されます。

グループ内のすべてのプロジェクトに対して

GitLab 15.9でgroup_protected_branches というフラグで導入されました。デフォルトでは無効です。

フラグ: セルフマネジメントのGitLabでは、デフォルトではこの機能は利用できません。利用可能にするには、管理者がgroup_protected_branchesという機能フラグを有効にします。GitLab.comでは、この機能は利用できません。

グループオーナーは、グループ用の保護ブランチを作成することができます。これらの設定はグループ内のすべてのプロジェクトに継承され、プロジェクトの設定で上書きすることはできません。特定のブランチがグループレベルとプロジェクトレベルの両方でAllowed to force push設定されている場合、_プロジェクト_レベルのAllowed to force push設定は無視され、グループレベルの設定が優先されます。

前提条件

  • グループのオーナーロールを持っている必要があります。

グループ内のすべてのプロジェクトのブランチを保護するには:

  1. 左のサイドバーで、Search(検索)を選択するか、Go to(移動)を選択してグループを探します。
  2. 設定] > [リポジトリ]を選択します。
  3. 保護されたブランチを展開します。
  4. 保護されたブランチを追加] を選択します。
  5. ブランチテキスト ボックスに、ブランチ名またはワイルドカードを入力します。
  6. Allowed to mergeリストから、このブランチにマージできるロールを選択します。
  7. プッシュとマージを許可するリストから、このブランチにプッシュできるロールを選択します。
  8. 保護]を選択します。

保護ブランチが保護ブランチのリストに追加されます。

ワイルドカードルールによる複数のブランチの保護

ワイルドカードを使用すると、1 つのブランチに複数のルールを適用できます。複数のルールがブランチに適用される場合、_最も権限の強い_ルールがブランチの動作を制御します。マージコントロールを正しく機能させるには、プッシュとマージを許可するユーザーの範囲を、マージを許可するユーザーよりも広く設定してください。

前提条件

  • 少なくともメンテナーのロールを持っている必要があります。

複数のブランチを同時に保護するには

  1. 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
  2. 設定] > [リポジトリ]を選択します。
  3. 保護されたブランチを展開します。
  4. 保護されたブランチを追加] を選択します。
  5. ブランチ] ドロップダウン リストから、ブランチ名とワイルドカードを入力します。たとえば

    ワイルドカードで保護されたブランチマッチングブランチ
    *-stable production-stable,staging-stable
    production/* production/app-server,production/load-balancer
    *gitlab* gitlab,gitlab/stagingmaster/gitlab/production
  6. マージ許可リストから、このブランチにマージできるロールを選択してください。
  7. プッシュとマージを許可するリストから、このブランチにプッシュできるロールを選択します。GitLab Premium や Ultimate では、グループや個々のユーザーを追加することもできます。
  8. 保護]を選択します。

保護されたブランチが保護されたブランチのリストに表示されます。

保護されたブランチを新規作成します。

少なくとも Developer ロールを持つユーザーは、保護されたブランチを新規作成できます。

前提条件:

  • Allowed to push and mergeis set toNo one.
  • マージを許可する] が [開発者] に設定されています。

保護ブランチを作成できるのは UI あるいは API のみです。これにより、コマンドラインや Git クライアントアプリケーションから誤ってブランチを作成してしまうことを防げます。

ユーザーインターフェイスから新しいブランチを作成するには

  1. 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
  2. コード > ブランチを選択します。
  3. 新しいブランチを選択します。
  4. ブランチ名を入力し、新しいブランチのベースとなる既存のブランチ、タグ、コミットを選択します。既存の保護されたブランチと、すでに保護されたブランチに入っているコミットのみ受け付けます。

保護されたブランチへのマージリクエストを、全員に提出させます。

保護されたブランチに直接チェックインするのではなく、全員にマージリクエストを提出させることができます:

  1. 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
  2. 設定] > [リポジトリ]を選択します。
  3. 保護されたブランチを展開します。
  4. 保護されたブランチを追加] を選択します。
  5. ブランチ] ドロップダウンリストから、保護するブランチを選択します。
  6. マージ許可リストから、開発者 + メンテナー を選択します。
  7. Allowed to push and mergeリストから、No one を選択します。
  8. 保護]を選択します。

すべての人が保護されたブランチに直接プッシュできるようにします。

書き込み権限を持つすべての人に、保護されたブランチへのプッシュを許可することができます。

  1. 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
  2. 設定] > [リポジトリ]を選択します。
  3. 保護されたブランチを展開します。
  4. 保護されたブランチを追加] を選択します。
  5. ブランチ] ドロップダウンリストから、保護するブランチを選択します。
  6. Allowed to push and mergeリストから、Developers + Maintainers を選択します。
  7. 保護]を選択します。

保護されたブランチにデプロイキーをプッシュできるようにします。

  • GitLab 13.7 で導入されました
  • この機能はGitLab.com 13.7で選択的にデプロイされたもので、すべてのユーザーが利用できるわけではありません。
  • この機能はGitLab 13.9で全てのユーザーが利用できるようになりました。

デプロイキーのオーナーに、保護されたブランチへのプッシュを許可することができます。ユーザーが関連プロジェクトのメンバーでなくても、デプロイキーは機能します。ただし、デプロイキーのオーナーは少なくともプロジェクトの読み取りアクセス権を持っている必要があります。

前提条件:

  • プロジェクトのデプロイキーを有効にする必要があります。プロジェクトのデプロイ キーは、作成時にデフォルトで有効になります。ただし、公開デプロイ キーがプロジェクトにアクセスできるようにする必要があります。
  • デプロイ キーには、プロジェクト リポジトリへの書き込み権限が必要です。

デプロイキーが保護されたブランチにプッシュできるようにするには、次のようにします:

  1. 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
  2. 設定] > [リポジトリ]を選択します。
  3. 保護されたブランチを展開します。
  4. 保護されたブランチを追加] を選択します。
  5. ブランチ] ドロップダウンリストから、保護するブランチを選択します。
  6. Allowed to push and mergeリストから、デプロイキーを選択します。
  7. 保護]を選択します。

デプロイ キーは、[マージ許可] ドロップダウン リストでは使用できません。

保護されたブランチでの強制プッシュの許可

保護されたブランチへの強制プッシュを許可することができます。

新しいブランチを保護し、強制プッシュを有効にするには

  1. 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
  2. 設定] > [リポジトリ]を選択します。
  3. 保護されたブランチを展開します。
  4. 保護されたブランチを追加] を選択します。
  5. ブランチ] ドロップダウンリストから、保護するブランチを選択します。
  6. プッシュとマージを許可]および[マージを許可]リストから、必要な設定を選択します。
  7. プッシュアクセス権を持つすべてのユーザーに強制プッシュを許可するには、[強制プッシュの許可] トグルをオンにします。
  8. CODEOWNERS ファイルに記載されているファイルを変更するコードプッシュを拒否するには、コードオーナーからの承認を必要とするトグルをオンにします。
  9. 保護]を選択します。

すでに保護されているブランチの強制プッシュを有効にするには:

  1. 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
  2. 設定] > [リポジトリ]を選択します。
  3. 保護されたブランチを展開します。
  4. 保護されたブランチを追加] を選択します。
  5. 保護されたブランチのリストで、ブランチの横にある、強制プッシュを許可するトグルをオンにします。

このブランチにプッシュできるメンバーは、強制プッシュもできるようになります。

ブランチが複数のルールにマッチする場合

ブランチが複数のルールに一致する場合、最も権限の強いルールによって、ブランチの保護レベルが決まります。たとえば、ワイルドカードを含む次のルールを考えてみましょう:

ブランチ名パターン強制プッシュの許可
v1.xはい
v1.*なし
v*なし

という名前のブランチは、v1.x 3つのブランチ名パターンすべてにマッチ v1.xします:,v1.*, およびv* にマッチします。最も寛容なオプションが動作を決定するので、ブランチv1.x の権限は次のようになります:

  • 強制プッシュを許可します:3つの設定のうち、Yes がもっとも寛容で、結果としてブランチの挙動を制御します。このブランチがv1.xv* (より厳しい権限を持つ) にもマッチしていたとしても、このブランチにプッシュできるユーザーなら誰でも強制プッシュできます。
note
group_protected_branches 機能フラグが有効で、グループオーナーが同じブランチに対してグループレベルの保護を設定している場合、プロジェクトレベルでのブランチの強制プッシュ設定は、グループレベルの設定によって上書きされます。

保護されたブランチでコードオーナーの承認が必要

GitLab 13.5 で導入された、保護ブランチにプッシュできるユーザーとグループは、機能ブランチをマージするためにマージリクエストを使う必要がありません。これは、マージリクエストの承認ルールをスキップできることを意味します。

保護されたブランチでは、コードオーナーによる少なくとも1つの承認を必要とすることができます。ブランチが複数のルールで保護されている場合、適用されるルールの_いずれかが_「コードオーナーの承認が必要」を有効にしていると、コードオーナーの承認が必要になります。

新しいブランチを保護し、コードオーナーの承認を有効にするには:

  1. 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
  2. 設定] > [リポジトリ]を選択します。
  3. 保護されたブランチを展開します。
  4. 保護されたブランチを追加] を選択します。
  5. ブランチ] ドロップダウンリストから、保護するブランチを選択します。
  6. プッシュとマージを許可]および[マージを許可]リストから、必要な設定を選択します。
  7. Require approval from code ownersトグルをオンにします。
  8. 保護]を選択します。

すでに保護されているブランチでコードオーナーの承認を有効にするには:

  1. 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
  2. 設定] > [リポジトリ]を選択します。
  3. 保護されたブランチを展開します。
  4. 保護されたブランチを追加] を選択します。
  5. 保護されたブランチのリストで、ブランチの横にあるコードオーナーの承認トグルをオンにします。

有効にすると、これらのブランチへのマージリクエストは、マッチしたルールごとにコードオーナーの承認者がいないとマージできなくなります。さらに、保護されたブランチへの直接のプッシュは、ルールにマッチすると拒否されます。

CODEOWNERS ファイルで指定されていないユーザーは、特に許可されていない限り、指定したファイルやパスの変更をプッシュすることができません。開発者が直接 protected ブランチにプッシュすることを制限する必要はありません。代わりに、コードオーナーによるレビューが必要な特定のファイルへのプッシュを制限することができます。

GitLab Premium 13.5以降では、保護ブランチへのプッシュを許可されているユーザーやグループは、機能ブランチをマージするためにマージリクエストを必要としません。そのため、コードオーナーを含むマージリクエストの承認者をスキップすることができます。

保護されたブランチでのパイプラインの実行

保護されたブランチにマージまたはプッシュする権限は、ユーザーが CI/CD パイプラインを実行し、ジョブに対してアクションを実行できるかどうかを定義します。

パイプラインのセキュリティモデルの詳細については、保護ブランチのセキュリティを参照してください。

保護されたブランチの削除

少なくともメンテナーのロールを持つユーザーは、GitLab ウェブインタフェースを使って手動で保護されたブランチを削除することができます:

  1. 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
  2. コード > ブランチを選択します。
  3. 削除したいブランチの横で、削除({remove}) を選択します。
  4. 確認ダイアログでブランチ名を入力し、「はい、保護されたブランチを削除します」を選択します。

保護されたブランチは、GitLab を使って UI または API からしか削除できません。これにより、ローカルの Git コマンドやサードパーティの Git クライアントから誤ってブランチを削除してしまうことを防ぐことができます。