保護ブランチへの直 push を禁止する
要約
特定のブランチへの直 push を禁止するためにはブランチ保護ルールを追加するだけでは足りず、マージ前の PR またはステータスチェックを必須にする必要があります。
保護ブランチ
目的
意図しない変更が入らないようにブランチを保護します。
設定方法
リポジトリの 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 を禁止するだけであれば常に成功するワークフローを作成します。
ジョブ名で設定することになるので一意になるように名前を付けます。
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
Require pull requests without requiring reviews | GitHub Changelogの更新で、 常に成功を返すActionを通す必要は無くなった感じっぽいですかね?