gitでリモートで変更があったファイルが存在する時に特定のコマンドを実行する方法

こんにちは、さるまりんです。

gitで管理しているソースコードをpullする際、何も変更されていない時は何もせず、変更が取得できるときは何かしら特定の処理を実行したい場合がありまして、その仕組みをスクリプトで書いてみました。

こんな感じです。

#!/bin/sh

# 現在チェックアウトされているブランチは?
CUR_BRANCH=$(git branch --show-current)

# まずはfetch
git fetch

# 更新があるか
MODIFIED=$(git diff origin/$CUR_BRANCH --name-only | grep -c -e "")

echo "$MODIFIED modified."

# 更新あり
if [ "$MODIFIED" -ne 0 ]; then
    # 更新があるのでgit pull
    git pull

    # さらに何かしたいことがあればそのコマンドはここへ
    echo "do something on update"
else
    # 変更なし
    echo "up to date nothing to do"
fi

上のスクリプトでやっていることは以下です。

まずは現在チェックアウトしているブランチ名をgit branch --show-currentで取得します。
そして、git fetchです。
git diff origin/$CUR_BRANCH --name-only | grep -c -e ""で変更されているファイル名の数を取得します。CUR_BRANCHは変数になっています。ローカルにチェックアウトされているブランチとリモートの同じブランチを比較するためにこうしています。
変更されたファイルの数は変数MODIFIEDに入っているので、それが0でなければ何かしら更新があったとしてgit pullした後に何か処理をしたければそれを実行します。例えばnpm run buildjscssの変更を反映したり。

変更のあるファイルの数をとる時にgrep -c -e ""としていますが、これはすべてのファイルが対象であればwc -lでもいいかもしれないですね。grepでやっているのは特定のファイルが変更されている場合のみ処理を実行する時にそのファイル名のパターンを指定することができるのでこうしています。

他にもいろんなことができそうですが、これ、実は仕組みがすでに用意されていたりする?
やりたいことをやりたいようにできるのがプログラミングの良さでもあると思うので、いろいろ試していきたいと思います。

読んでくださってありがとうございました。
それではまた!