ブランチ戦略を用いて開発を行なっていると、すでに不要になったブランチが削除されずに放置され、気づくと膨大なブランチ数になっていたりします。かといって、手動で毎回消すのも面倒ですよね。
今回は、そんな放置ブランチ削除の自動化をGithub Actionsで実現する方法を記事にしました。
GitHub 標準の自動機能
GitHub にはプルリクエストがリポジトリにマージされた際にブランチを自動的に削除する機能があります。
https://docs.github.com/ja/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-the-automatic-deletion-of-branches
しかし、こちらの機能では、マージ先がどのブランチであっても削除されてしまうため、1つのブランチを複数ブランチにマージするブランチ戦略を取った場合の運用には適していません。
そこで GitHub Actions を用いて、独自の自動削除を実現することにしました。
特定のブランチにマージされたブランチを自動削除
方法は、非常に単純で、以下のコマンドを Github Actions で実行するだけです。
git branch -r --merged=main | grep -vE '^\s*origin/(main$|develop$|HEAD$)' | sed 's/origin\///' | xargs git push --delete origin
このコマンドでは、mainブランチにマージされたdevelop以外のブランチを全て削除します。
- mainにマージされたブランチを取得
git branch -r --merged=main
- 削除しないブランチ(ここでは、main, develop)を除外
grep -vE '^\s*origin/(main$|develop$|HEAD$)'
- 取得したブランチ名から origin を削除
sed 's/origin\///'
- 3でフォーマットされたブランチ名に対応するブランチを全て削除
xargs git push --delete origin
Github Actions 定義
main ブランチへのプッシュ時にmainブランチにマージされたブランチを削除するGithub Actionsの実際の定義です。
name: "Delete Merged Main Branches"
on:
push:
branches:
- main
jobs:
delete:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
# 全てのブランチ一覧を取得
fetch-depth: 0
- name: Delete Branches
run: |
git branch -r --merged=main | grep -vE '^\s*origin/(main$|develop$|HEAD$)' | sed 's/origin\///' | xargs git push --delete origin
最後に
今回は、ブランチの自動削除を GitHub Actions で実現しました。実行するコマンドを修正すれば、さまざまな条件に対応できると思います。
GitHub Actionsを使えば、ブランチ操作や GitHub の面倒な作業を自動化できるので今後も積極的に使っていきたいですね。