👮

保護ブランチへの直 push を禁止する

2021/07/17に公開
1

要約

特定のブランチへの直 push を禁止するためにはブランチ保護ルールを追加するだけでは足りず、マージ前の PR またはステータスチェックを必須にする必要があります。

保護ブランチ

目的

意図しない変更が入らないようにブランチを保護します。

https://docs.github.com/ja/github/administering-a-repository/defining-the-mergeability-of-pull-requests/about-protected-branches

設定方法

https://docs.github.com/ja/github/administering-a-repository/defining-the-mergeability-of-pull-requests/managing-a-branch-protection-rule

リポジトリの Settings > Branches > Branch protection rules > Add Rule で設定できます。

Branch name pattern に保護したいブランチ名を入力します。
パターンも使えるので milestone/* のような指定もできます。詳細はドキュメント参照。

直 push を禁止するためにはマージ前の PR またはステータスチェックを有効にする必要があります。
ステータスチェックが不要であればマージ前の PR にチェックを入れれば十分です。
Include administrators にチェックを入れて管理者も対象にしておきましょう。

以前はマージ前の PR ではなくレビューだったので一工夫必要でした(古い GHES ではこちらを参考にしてください)

レビューを必須にする場合

Require pull request reviews before merging にチェックを入れます。
デフォルトだと 1 人以上のレビューが必須になります。

ステータスチェックを必須にする場合

レビューを必須にしたくない場合はこちらを設定します。
既に CI が走っているようだったら Search for status checks in the last week for this repository から検索して必須にしたいものを設定します。
必須にしたいものがない場合は常に成功を返すステータスを作成します。

常に成功を返すステータスを作成する

ステータスの実装には GitHub Actions を使うのがお手軽です。
直 push を禁止するだけであれば常に成功するワークフローを作成します。
ジョブ名で設定することになるので一意になるように名前を付けます。

.github/workflows/branch-protection.yml
name: Branch protection

on:
  pull_request:

jobs:
  success:
    runs-on: ubuntu-latest

    steps:
      - run: echo "Always success"

保護ブランチのステータスチェックで success を required に設定します。

直 push しようとすると…

直 push しようとするとリジェクトされます。
force push やブランチの削除もできません。

当然 GitHub 上で編集しようとしたときも保護ブランチへは直接コミットできません。

直 push やブランチの削除をしたくなった場合

保護ブランチの設定で force push や削除を有効にすることができます。

Discussion