GitHubでレビューで指摘をもらったり、自分で間違いを見つけたとき、修正のためにgitのfixupコミットを使う人は多いと思います。
多くの開発チームではレビューが通ればfixupコミットをrebaseコマンドなどで、修正先のコミットにfixupコミットを取り込んでからマージする場合が多いでしょう。
ただ、何も対策を講じていないと あっ!fixupコミットをrebaseしないままmaster(main)にマージしちゃった・・・・ となることが多いです(自分もやらかしたことがあります)。
GitHubを使っている人の場合 https://github.com/mozamimy/autosquash-please のような拡張を入れることで防ぐことができますが、発火しない場合があったりGitHubが変更を加えるとアップデートまで動かなくなる問題があります。
そこで今回紹介する block-autosquash-commits-action を導入することでfixupコミットの混入を防ぐ策を紹介します。
導入方法
シンプルで、.github/workflows/(適当な名前).yml
に下記の記述を行うだけです。
on: pull_request
name: Check include fixup/squash commit
permissions:
pull-requests: read
jobs:
message-check:
name: Block Autosquash Commits
runs-on: ubuntu-latest
steps:
- name: Block Autosquash Commits
uses: xt0rted/block-autosquash-commits-action@v2
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
また、各リポジトリのBranch protection ruleに対してこのような設定をします。
ブランチは今回mainを守りたいので main
、そしてBlock Autosquash Commits(yml参照)を合格しないと、マージできないという設定を加えています。
ここまで設定した上で、fixupコミットを含めたPRを作ってみます。
すると、普段はあるマージボタンが消えており、しっかりマージができないようになっています。
逆にfixupを解消するとマージができるようになっています。
まとめ
今回はblock-autosquash-commits-actionとGitHubのBranch protection ruleと掛け合わせることでfixupコミットのままマージを阻止する仕組みを作成してみました。
各リポジトリに設定を入れないといけないのがネックですが、拡張機能をチームメンバーに入れてもらうなどの手間はなくなるので是非導入を検討をしてみてください。