リモートトラッキングブランチが現在のブランチと異なるかどうかを確認するための最速の方法を探しています。
コンテキスト:cronジョブを実行したいのですが、ローカルブランチの現在のHEADがリモートトラッキングブランチと同一であるかどうかを確認します。このcronを実行しているホストは数百ある可能性がありますjob(それぞれが異なるブランチ/ HEADにある可能性があります)。したがって、これを可能な限り高速かつ効率的に実装したいと思います(gitサーバーでのネットワーク負荷とCPU負荷を最小限に抑えます)
現時点では、git fetch
を実行してから、git status
を実行します。ただし、リモートホストで他のブランチが変更された場合でも、git fetch
はしばらくビジー状態になり、git status
もそれほど効率的ではありません。
リポジトリはgitlabサーバーでホストされています(httpsアクセスのみ、リポジトリには認証が必要です)
したがって、純粋なgitソリューションはgitlabソリューションと同じくらい高く評価されています。
ソリューションをbash
スクリプトまたはpython
スクリプトとして実装したいと思います。有用な依存関係のpip install
は問題ではありません。
実際、ホスト上のいくつかのリポジトリ(すべて同じ資格情報でアクセス可能)に対してこのチェックを実行したいと思います。 1つのチェックを最適化できれば、可能な限りうまくいくと思います。リポジトリごとにこのチェックを実行します。
ただし、1つのスクリプトで複数のリポジトリをクエリすることでパフォーマンスを向上させるトリックがある場合は、これもオプションです。 (例:一度だけ認証する、複数のリポジトリにクエリを実行する)
git ls-remote
を使用して、すべてのリモート参照とそのオブジェクトIDを一覧表示します。
git ls-remote Origin
git ls-remote Origin refs/heads/master
同じコマンドがローカルリポジトリに対して機能しますが、git rev-parse
の方が効率的です。
git ls-remote .
git rev-parse refs/heads/master
git rev-parse master
現在のブランチは、HEADを別の参照への「シンボリック」参照にすることで設定されます:
branch=$(git symbolic-ref HEAD)
ただし、更新をフェッチする場合はとにかく、特定のブランチ参照を使用してgit fetch
に直接移動することもできます。
git fetch Origin refs/heads/master:refs/remotes/Origin/master
git fetch Origin master:Origin/master
フェッチされたブランチは常にrefになり、同じ方法で比較できます。
git rev-parse refs/heads/master
git rev-parse refs/remotes/Origin/master
(完全な参照名は、ほとんどの場合、master:Origin/master
に短縮できますが、スクリプトには入れません。)