web-dev-qa-db-ja.com

リモートトラッキングブランチが変更されたかどうかを効率的にチェックします(gitまたはgitlab)

リモートトラッキングブランチが現在のブランチと異なるかどうかを確認するための最速の方法を探しています。

コンテキスト: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つのスクリプトで複数のリポジトリをクエリすることでパフォーマンスを向上させるトリックがある場合は、これもオプションです。 (例:一度だけ認証する、複数のリポジトリにクエリを実行する)

1
gelonida

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に短縮できますが、スクリプトには入れません。)

3
user1686