gitの更新があるかどうか確認するshellスクリプト

2020年1月4日

テクノロジー

ユゲタです。 WEBサイト構築用のフレームワークって便利なものがたくさん公開されていますが、自作したのが一番使いやすいと思って、作り込んでいるんですが、 PHPのcomposerを見習って、ライブラリ管理を自動で行えるように、リポジトリ(github)にあるデータが更新されているかどうかをチェックできるスクリプトを書いてみました。 チェックプログラムを実行した時に、対象のライブラリがない場合は自動でcloneできるようにしてみました。

shellコード

#!/bin/bash # check-directory /vendor # フォルダがない場合は作成 DIR="plugin" if [ ! -e $DIR ]; then mkdir $DIR fi # 任意pluginのチェック PLUGIN="test" if [ -e $DIR/$PLUGIN ];then cd $DIR/$PLUGIN # check-head(commit-id) CID0=`git log --pretty=format:"%H"|head -n 1` echo $CID0 CID1=`git ls-remote origin HEAD|awk '{print $1}'` echo $CID1 if [ $CID0 = $CID1 ]; then echo "Same !"; else echo "Diff !"; fi else # clone git clone https://github.com/yugeta/test.git $DIR/$PLUGIN fi

実行注意点

このプログラムを実行すると、実行した階層に"plugin"というフォルダが作られてその中にtest登録してあるgithubのリポジトリがcloneされます。 その後、githubのリポジトリに更新があった場合に、コマンドを叩くと"diff"文字列が表示され、更新がない場合は"same"と表示されます。 diffの時に、git pullを実行すれば、更新がある場合に自動更新ができるスクリプトの出来上がりです。 プログラム制御して、任意アップデートにしたい場合は、別のスクリプトで実行して、連動させるといいでしょう。

解説

このプログラムのポイントは、gitリポジトリのコミットIDを取得して、ローカル(公開サーバー)とサーバー(github)に違いがあるかどうかを判定するという処理です。 ローカルリポジトリのコミットIDを取得するには、"git log"を仕様しているんですが、オプションのpretty-formatでIDのみを抜き出しています。 git log --pretty=format:"%H" 一方Github側からは、fetchなどでデータを一旦抜き出す方法もありますが、最新のコミットIDのみ取得できればいいので、普段はあまり使わない、"ls-remote"というオプションを使用します。 git ls-remote origin HEAD 最新情報なのでHEAD位置を取得するんですが、このままだと、HEADという文字がくっついてくるので、awkでID部分だけを抽出するように細工しています。 本来なら多機能なGITに、リポジトリとローカルのコミット状態の比較がダイレクトにできてもいいぐらいなのですが、今のバージョンでは機能が見つけられなかったので、「無い」という判断で力技で行うようにしました。 うすうすお気づきの人もいるかもしれませんが、テンプレートファイルにライブラリ一覧を記述しておき、それぞれloopで回しながらこの処理をすることで、リポジトリ型のライブラリの自動更新やアップデート確認などが一括または自動でできてしまうという便利ツールにできます。 PHPのconposerだけでなく、javascriptライブラリや、その他のモジュール群なども、この方式で便利なデプロイ環境が構築できますね。 そこまで高機能なツールに作り込んだらまたこのブログでご紹介したいと思います。

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。