ローカルにWIPコミットがあったらgit pushを止める
ローカルで実験的にやっている作業をpushしたくないな〜と思って調べました。
Git本来のフック機能(.git/hooks/pre-push
)を使えそうかな?と思いCopilotに聞いたのですが、各リポジトリで設定しなければならず、グローバルにフックを設定することはできないとのこと。
代わりにサブコマンドを用意する方法を提示されました。
まず、git log origin/$(git rev-parse --abbrev-ref HEAD)..HEAD --oneline
で未pushのコミットを一覧できます。そして、gitはPATHにgit-xxx
というスクリプトを置くとgit xxx
の形式で実行できる機能があります。これらを利用して、次のようにpush-with-check
というスクリプトを作ればgit push-with-check
というサブコマンドを作ることができます。
#!/bin/bash
if git log origin/$(git rev-parse --abbrev-ref HEAD)..HEAD --oneline | grep -i "wip"; then
# display error message in red
echo -e "\n\033[31mError: Found 'wip' in local commit. Please fix before pushing.\033[0m"
exit 1
fi
git push
とはいえ、これだといちいちgit push-with-check
と打たないといけません。が、そもそも筆者は普段からpush
というシェルエイリアスを使っていて、git push
とは打っていないことを思い出しました。このエイリアスを書き換えたらええやん!
-alias push='git push'
+alias push='git push-with-check'
これで、(筆者としては)ワークフローを大きく変えなくてもwip確認が動くようになりました。ローカルにwipのついたコミットがあると警告が出てきます。
さらに、筆者はlazygitを使っているので、こちらからもpush-with-checkを使えるよう修正を入れます。P
キーがpushに割り当てられているので、これを上書きします。
customCommands:
- key: 'P'
context: 'global'
command: 'git push-with-check'
(筆者は最初context: 'files'
だけで十分だろうと思っていたらcommitsでも効いていて誤pushしました)
これで、lazygitのP
でもwipコミットのpushを止められます。
Discussion