GitHub Branch Protection 怎麼轉 Repository Rulesets?先檢查風險與驗證流程
GitHub 在 2026 年 8 月 11 日新增了把既有 Branch Protection 規則轉成 Repository Rulesets 的導引流程。以前要遷移,通常得手動重新建立 required reviews、status checks 和 push restrictions;現在可以從 repository 設定直接啟動轉換。
這個功能解決的是「搬遷規則很容易漏項」的問題,但按下 Convert to ruleset 不代表舊規則已經安全消失。GitHub 會建立一個或多個 Active ruleset;如果原本的 Branch Protection 仍保留,兩邊會同時套用。正確做法是先預覽新行為、測試一個低風險分支,再決定何時刪除舊規則。
Branch Protection 和 Repository Rulesets 的差異
兩者都能保護分支,但管理模型不同。Branch Protection 通常是一條規則對應一組分支;Rulesets 可以用 pattern 套用到多個分支,也能疊加多層規則。
| 控制面 | Branch Protection | Repository Rulesets |
|---|---|---|
| 套用範圍 | 一條規則對應符合條件的分支 | 可用 branch pattern 套用多個分支 |
| 多層政策 | 同一分支主要由一條規則控制 | 多個 rulesets 可以同時套用,最嚴格結果會生效 |
| Bypass | 依既有分支保護設定處理 | 可指定使用者、團隊或 GitHub App 的 bypass 權限 |
| 可見性 | 需進設定頁查看規則 | 有讀取權限的人可以查看 active rulesets |
| 測試方式 | 修改規則本身,或另建條件測試 | 可先用不同 enforcement status 觀察,再逐步啟用 |
GitHub 官方文件也提醒,Rulesets 和 Branch Protection 可以並存,而且所有適用規則都會被執行。因此,遷移期間暫時保留舊規則是安全的觀察手段,但不能把「兩邊都開著」當成最後狀態。
轉換前先盤點會被搬過去的設定
GitHub 的轉換工具會把現有規則映射成對應的 ruleset。開始前,先把下面幾項從舊規則頁面記下來:
- required approving reviews 的數量、dismiss stale reviews 與 code owner review。
- required status checks 的名稱,以及是否要求 branch 必須是最新狀態。
- push restrictions、force push、branch deletion 和 signed commit 等限制。
- bypass actor、administrator 是否可以略過規則,以及部署 bot 是否依賴這個例外。
- 哪些 branch pattern 會命中這條規則,避免轉換後把範圍放大。
其中有一個不能直接一對一搬遷的例外:Require conversation resolution before merging。在 Branch Protection 中它是獨立設定;在 Rulesets 中則屬於 pull request rule 的一部分,必須同時啟用該類 pull request rule 才會套用。這是最值得在轉換預覽畫面再次核對的項目。
如果團隊目前有 required check 偶爾因 path filter 被 skipped,可以先看站內的 GitHub Actions required check 被跳過時的排查流程。那篇處理的是 check 狀態與 workflow 觸發邏輯;本篇處理的是分支治理規則如何搬遷,兩者不要混成同一個問題。
GitHub 的轉換流程怎麼走
轉換是 repository 層級的管理操作,需要 repository admin 或具備 edit repository rules 權限的自訂角色。
- 開啟 repository,進入 Settings。
- 在左側 Code and automation 區段選擇 Branches。
- 在 Branch protection rules 找到要搬遷的規則,點選 Convert to ruleset。
- 為轉換產生的每個 ruleset 命名,閱讀 New behavior 預覽。
- 確認規則範圍、required checks、review 和 bypass 後,選擇是否在完成遷移時刪除舊 Branch Protection。
- 建立 ruleset,並在實際 PR 上驗證。
官方文件的建議是一次轉換一條 Branch Protection 規則。若一條舊規則會產生多個 rulesets,建立按鈕會顯示數量;不要只看到名稱相近就以為它一定是一對一的複製。
先不要勾選刪除舊規則
如果這是 production repository,我會先保留原本的 Branch Protection。原因不是新功能不可靠,而是你需要一個短暫的對照期來確認:
| 驗證案例 | 要確認的結果 |
|---|---|
| 正常 PR | required review、status check 和 merge block 都照預期運作 |
| 未通過 check 的 PR | 新 ruleset 仍會阻止合併,而不是只顯示提示 |
| 不符合 branch pattern 的分支 | 沒有意外套用 production 規則 |
| 維運 bot 或 release App | 只有原本允許的 bypass 還存在 |
| conversation resolution | pull request rule 是否真的包含這項要求 |
在舊規則仍存在時,Active ruleset 會和它一起執行。如果測試時突然比原本多一道限制,先比較兩份設定,不要直接把其中一份改成更寬鬆。
什麼時候可以刪除原本的 Branch Protection
測試通過後回到 Branches 設定頁。如果新 ruleset 已完整涵蓋原規則,GitHub 會把原本的按鈕改成提示,表示這條 Branch Protection 可以安全刪除。這個提示是「目前映射看起來完整」的訊號,不是替你完成風險審核。
刪除前再做三個人工確認:
- 新 ruleset 的 target branches 沒有比舊規則更廣或更窄。
- bypass actor、GitHub App 和部署流程仍能在預期位置工作。
- required checks 的 context 名稱沒有因 workflow 改名或分層而失效。
若團隊接著要把相同政策套到 organization 的多個 repository,可以在單一 repository 驗證完成後,再評估 organization-level rulesets。不要把一次成功的轉換直接複製到所有 repository,因為每個 repo 的 branch pattern、release bot 和 required checks 可能不同。
轉換後的治理重點
Repository Rulesets 的價值不只是新介面。它讓規則可以分層、讓 active rulesets 對有讀取權限的開發者可見,也能把 bypass 權限明確指派給團隊與 App。這些特性適合拿來整理「誰能合併」和「哪些分支必須經過什麼檢查」的責任邊界。
但它仍然不是完整的 CI 安全策略。Ruleset 控制分支與標籤互動,不能取代 workflow 的 permissions、pull_request_target checkout 安全、environment reviewer 或第三方 action 的版本審查。若要限制的是「誰能讓 workflow 進入 runner」,那是 GitHub Actions workflow execution protections 的問題,不是 branch ruleset 的替代方案。
把規則搬到 Rulesets 後,最有用的維護紀錄至少應包含:轉換日期、原規則名稱、產生的 ruleset 名稱、保留或刪除舊規則的決定,以及測試過的 PR。未來有人看到合併被擋時,才知道要查哪一層政策。
常見問題
Q: Convert to ruleset 會自動刪除原本的 Branch Protection 嗎?
A: 不會。轉換流程可以選擇在遷移完成後刪除原規則,但預設應先保留並驗證。若保留,原本的 Branch Protection 和新 Active ruleset 會同時套用;等確認新規則完整涵蓋舊規則後,再從 Branches 頁面刪除。
Q: Rulesets 會取代所有 Branch Protection 規則嗎?
A: 不會。兩種規則可以並存,且所有符合條件的規則都會執行。Rulesets 提供更容易分層與跨分支管理的模型,但既有 Branch Protection 不會因為功能上線就自動消失。
Q: conversation resolution 為什麼要特別檢查?
A: 因為它在 Branch Protection 中是獨立設定,但在 Rulesets 中屬於 pull request rule 的一部分,轉換時不一定能一對一對應。要從轉換預覽和新 ruleset 內容確認 pull request rule 真的已啟用。
參考資料:
GitHub Changelog:Automatically migrate branch protection rules to repository rulesets
回報錯字、失效連結,或告訴我你想看的延伸主題。