git pull报错Server does not allow request for unadvertised object如何解决
问题根本原因
Server does not allow request for unadvertised object报错与本地仓库损坏、Git Bug无关,核心触发逻辑如下:
- 上游原始仓库的
vmscl子模块当前绑定的提交哈希8cc8573b39c9efde42a77701b91b3b6dcbb6b7ac,在你本地配置的vmscl子模块远端仓库中不存在:通常是子模块远端被强制推送覆盖了历史提交,或者该提交仅存在于原始仓库关联的私有子模块克隆地址中 Server refused to set environment variables是SSH服务端关闭了PermitUserEnvironment配置,属于服务端常规限制,不影响代码拉取逻辑,可直接忽略
可行解决方案
方案一:重置对齐上游最新状态(适用于无本地未提交修改的场景)
你未对子模块做自定义修改,直接对齐上游原始仓库的最新状态即可解决问题:
- 添加上游原始仓库为本地远端(未添加时执行)
git remote add upstream ssh://site/original.git
- 拉取上游最新代码并强制对齐本地主分支
注意:该操作会丢弃你本地主分支的所有未提交修改,请提前备份需要保留的内容
git fetch upstream git reset --hard upstream/master
- 强制同步子模块到当前父仓库绑定的版本
git submodule update --init --force --remote vmscl
- 如仍报错,删除本地子模块缓存后重新初始化
rm -rf vmscl .git/modules/vmscl git submodule sync vmscl git submodule update --init --recursive vmscl
方案二:保留当前父仓库提交(适用于不能对齐上游最新的场景)
如果不需要重置父仓库版本,可临时修改子模块远端地址拉取缺失提交:
- 临时将子模块远端切换为原始仓库对应的子模块地址
git config submodule.vmscl.url ssh://site/vmscl
- 拉取子模块全量历史后执行更新
cd vmscl git fetch --all cd .. git submodule update
- 操作完成后可将子模块远端地址改回原有配置
内容的提问来源于stack exchange,提问作者Alexander Dyagilev
相关产品推荐
相关产品推荐

