Git能否从远程仓库的push URL执行pull操作以解决镜像延迟问题?
跨镜像Git拉取最新推送内容的实现方案
背景
为降低跨网流量开销、提升用户Git操作效率,我们搭建了本地只读Git镜像,远程仓库典型配置如下:
$> git remote -v origin ssh://git@local.mirror.company.com/repo.git (fetch) origin ssh://git@central.server.over.slownetwork.company.com/repo.git (push)
该配置日常运行稳定,但存在镜像同步延迟的痛点:Git推送要求本地分支与远端分支保持同步,而中心服务器向本地镜像同步存在数秒到数十秒的延迟,即使用户执行git pull也可能拿到的是未同步的旧版本代码。哪怕延迟只有12秒,用户如果刚好在延迟窗口执行git pull && git push操作,就会出现拉取完代码仍推送失败的问题,严重影响操作体验。
核心需求
希望实现类似git pull --pull-from-push-url的能力,直接从推送对应的中心服务器URL拉取最新内容,从根本上规避镜像同步延迟带来的问题。
注:已知可以直接执行git fetch <中心服务器URL>,但原生的该操作无法自动完成提交的合并/变基,也不会更新remotes/origin/<分支名>对应的本地引用,无法满足需求。
实现方案
基于社区用户@jthill的思路,可通过如下自定义脚本实现需求,该方案仅拉取当前工作分支保证拉取速度,同时兼容未配置独立推送URL的通用场景:
git fetch "$(git config remote.origin.pushurl || git config remote.origin.url)" \ "$(git rev-parse --symbolic-full-name --abbrev-ref @{upstream} | sed -r -e 's=^origin/(.*)=+refs/heads/\1:refs/remotes/origin/\1=')"
内容的提问来源于stack exchange,提问作者Mort
相关产品推荐
相关产品推荐

