結論
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)
をしてしまうことを防げればそれでいいので、こういう書き方にとどめています
参考
*1:たとえば gh など