git push -f origin master したら Get Wild が流れる pre-hook

master ブランチに force-push をして、履歴を削除するなんていう Wild な貴方に。

force-push した時に、master ブランチ宛の場合にそれを禁止し、Get Wild を再生する pre-push スクリプトを作りました。

pre-push

pre-hook スクリプトは以下。

#!/bin/bash

FORCE_PUSH="force|delete|-f"
# force push を禁止するブランチを複数指定可能
PROTECTED_BRANCHES="(master|develop)"
PUSH_COMMAND=`ps -ocommand= -p $PPID`

while read local_ref local_sha1 remote_ref remote_sha1
do
  if [[ "${remote_ref##refs/heads/}" =~ $PROTECTED_BRANCHES && "$PUSH_COMMAND" =~ $FORCE_PUSH ]]; then
    echo "This force-push to the ${remote_ref##refs/heads/} branch has been blocked."
    echo "Get wild and tough!"
    # mac なら 標準装備の afplay で音楽再生可能
    afplay ~/Get\ Wild.m4a -q 1
    exit 1
  fi
done

force push を禁止するブランチを複数指定出来ます。

afplay は Mac 標準装備のプレーヤーなので、Windows や Linux では違うものを使ってください。

 

Demo

 

Setting

まず適当な場所に git_template/hooks のディレクトリを作成します。

上記スクリプトを pre-push という名前で作成し、chmod +x で実行権限を追加しておきます。

 

$ mkdir -p ~/.git_template/hooks
$ touch ~/.git_template/hooks/pre-push
$ chmod +x ~/.git_template/hooks/pre-push

 

git config --global init.templatedir を設定しておくと、git clone 時に .git/.git_template/hooks/* スクリプトがコピーされるようになります。既にclone済のリポジトリでは git init し直すと反映されます。

 

$ git config --global init.templatedir ~/.git_template
$ cd <repository> && git init

 

以上

Get wild and tough!

Get Wildgit