【git hooks】pre-pushで特定のブランチへの誤pushを防止するようにした

はじめに

リリース時にのみmasterにpushすることがあるんですが、これをリリース時以外にやってしまうとrevert操作などが必要になって結構面倒なことになります。

そこで、git hooksのpre-pushフックを使って特定のブランチへのpushの際に確認メッセージを表示するように設定しました。(chatGPTの力も存分に借りながら)

設定方法

1. .git/hooks/git-pushファイルを作成する
2. 設定を記載する

以下の設定では、masterdevelopにpushするときに、[WARNING] push to ブランチ名, are you sure? (Y/n)といったメッセージが表示され、Yを入力した際にのみpushがされます。

#!/bin/sh

protected_branches="master develop"
current_branch=$(git branch --show-current)

for branch in $protected_branches; do
  if [[ "$current_branch" == "$branch" ]]; then
    echo "[WARNING] push to $branch, are you sure? (Y/n)"
    exec < /dev/tty
    read answer

    if [[ $answer != "Y" ]]; then
      echo "Push canceled"
      exit 1
    fi
  fi
done

exit 0
3. 実行権限を付与

作成したファイルに実行権限を付与します。

$ chmod +x .git/hooks/pre-push

以上で、設定は完了です。

確認

例えば、nを入力するとpushはキャンセルされます。

$ git push
[WARNING] push to master, are you sure? (Y/n)
n
Push canceled

逆に、Yを入力すればpushされます。

おわりに

chatGPTに言われた方法だと、readコマンドを使う方法で、それを元に色々試してみたのですが、うまくいかなかったです。(pre-pushで行うのも関係している、、?と思いましたが深追いはしていません)

ググっていたら以下の記事に出会って、readコマンドではなく、exec < /dev/ttyで行うようにしました。

  • 参考記事

dev.classmethod.jp