我正在寻找最快的方法来找出远程跟踪分支是否与当前分支不同。
上下文:我想运行一个 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
但我不会将其放在脚本中。)