Git の pre-push hooks を用いて git push --force (git push -f) を防ぐ方法(簡易的)

結論

hooks の pre-push に、以下のように書きます。

#!/usr/bin/env bash
set -euo pipefail

PUSH_COMMAND_DETAIL=$(ps -ocommand= -p $PPID)
PROHIBITED_COMMANDS=("git push --force" "git push -f")
ERROR_MESSAGE="ERROR: --force や -f オプションの使用は禁じられています。"

for command in "${PROHIBITED_COMMANDS[@]}"; do
  if [[ "$PUSH_COMMAND_DETAIL" == "$command" ]]; then
    echo "$ERROR_MESSAGE"
    exit 1
  fi
done

exit 0

注意点

  • コードを見ればわかるように、単に $ git push -f または $ git push --force というコマンドと完全一致する場合にのみ、防ぎます
    • オプションが順不同で入り乱れる場合や、他ツール*1を経由した場合などでは判定をすり抜ける可能性があります
    • 自分としては、手癖で $ git push -f (--force) をしてしまうことを防げればそれでいいので、こういう書き方にとどめています

参考

onk.hatenablog.jp

zenn.dev

*1:たとえば gh など

Powered by はてなブログ