普段Gitを使ってて頻繁にブランチの切り替えを実行しているとたまに git pull
を忘れてしまい、作業が完了して git push
しようとすると既にリモートには別のコミットが存在してエラーになってしまうことがあります。
その時には git pull
すればいいんですが、コミットログに不要な merge
が入ってしまい少し気持ち悪いですね。
Gitでブランチを切り替える際に自動的に最新の状態を pull
すればそういう問題は解消しそうです。
Git Hooks
Git HooksとはGitで何かしらのイベントが発生する前後でスクリプトを実行可能にする仕組みです。
exit 0
でスクリプトが終了すればその先の処理も実行されますがそれ以外( exit 1
など )で終了すると処理を途中で止めることができます。
具体的には公式のドキュメントを参考にしてください。
post-checkout
先述した公式のドキュメントには掲載されていませんが、 post-checkout
を利用すればブランチ切り替えの際にスクリプトを実行することができます。
それでは簡単なスクリプトを作成してみましょう。
前提
Gitがインストールされ、 .git
ディレクトリが存在するパスで作業することを前提にしています。
Gitが利用できるLinux系のOSであれば大抵問題無いかと思いますが、当方の作業OSはmacOS 10.15.2(19C57)、 git version 2.23.0
です。
スクリプトの作成
Terminal上で作業します。
# post-checkoutファイルの作成
touch .git/hooks/post-checkout
# 実行権限を付与
chmod +x .git/hooks/post-checkout
# ファイルを編集
vim .git/hooks/post-checkout
vimの画面上でiキーを押下して⌘+Vで下記のスクリプトを貼り付けます。
# !/bin/sh
# 現在のブランチを取得する(参考: https://qiita.com/sugyan/items/83e060e895fa8ef2038c)
CURRENT_BRANCH=`git symbolic-ref --short HEAD`
# リモートの情報をfetchする
git fetch -p
# リモート(origin)にブランチが存在するかどうかを判定
exists=`git show-ref remotes/origin/$CURRENT_BRANCH`
if [ -n "$exists" ]; then
# リモートにブランチが存在すればpullを実行
git pull origin $CURRENT_BRANCH
fi
esc
キーを押下して :wq
と入力してEnterを押下して保存してvimを終了します。
結果
git switch
や git checkout
でブランチを切り替えると最新の情報を取得してくるスクリプトが完成しました。
% git switch master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
From github.com:fromkk/SpellChecker
* branch master -> FETCH_HEAD
Already up to date.
ただ、ブランチ切り替えの際に少し待つようになってしまうので人によっては邪魔に感じてしまうかもしれません。
利用する際は用法・用量を守って正しく利用しましょう。