有效检查远程跟踪分支是否发生变化(git或gitlab)

有效检查远程跟踪分支是否发生变化(git或gitlab)

我正在寻找最快的方法来找出远程跟踪分支是否与当前分支不同。

上下文:我想运行一个 cron 作业,该作业应查明本地分支的当前 HEAD 是否与其远程跟踪分支相同。可能有数百台主机运行此 cron 作业(每台可能位于不同的分支/HEAD 上)。因此,我希望尽可能快速高效地实现这一点。(尽可能减少 git 服务器的网络负载和 CPU 负载)

目前我执行了 agit fetch然后git status。但是即使远程主机上的其他分支发生了变化,git fetch也会忙碌一段时间,而且git status效率也不高。

该存储库托管在 gitlab 服务器上(仅限 https 访问,存储库需要身份验证)

因此纯 git 解决方案与 gitlab 解决方案一样受到赞赏。

我想将解决方案作为bash脚本或python脚本来实现。pip install任何有用的依赖关系都不是问题。

事实上,我想对主机上的几个存储库执行此检查(所有存储库都可使用相同凭据访问)。我想,如果我可以优化一项检查,那么我会做得尽可能好,我会对每个存储库执行此检查。

但是,如果可以通过一个脚本查询多个存储库来提高性能,那么这也是一种选择。(例如,只进行一次身份验证,查询多个存储库)

答案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

获取的分支始终会成为引用,您可以按照相同的方式进行比较:

git rev-parse refs/heads/master
git rev-parse refs/remotes/origin/master

(完整的引用名称几乎总是可以缩短为master:origin/master但我不会将其放在脚本中。)

相关内容