服务器不允许请求未公布的对象

Server does not allow request for unadvertised object

我知道以前有人问过这个问题,但我找到了所有答案,只是给我一个快速解决问题的方法,或者对为什么会发生以及如何实际解决的令人困惑的解释。

这就是我遇到此错误的原因。我的一位队友在我们的回购协议中推动了对子模块的更改。从 master 拉取后 git status 在我们的子模块中显示了新的提交:

modified: path/to/submodule/submodule_name (new commits)

所以我决定通过 运行

更新子模块

git submodule update path/to/submodule/submodule_name -- here is the doc for this command

此时我得到了错误

Fetched in submodule path 'path/to/submodule/submodule_name', but it did not contain ... Direct fetching of that commit failed

谷歌搜索后,我发现了我的问题的不同答案:

  1. github
  2. superuser

超级用户 link 让我更接近于理解这个问题,github 只是交给我 运行 修复它的命令 -- git submodule sync

现在,我仍然对更改如何出现在我的 git status 中感到困惑,但是当我尝试更新服务器时并不知道该提交。 git submodule sync 如何使该提交可用?

您的错误消息确实提到:

dit did not contain ... Direct fetching of that commit failed

这是典型的在子模块原始克隆存储库中完成的提交...没有推回其远程存储库。
但是子模块仓库的新状态记录在父仓库中,被推送。

这意味着:

父仓库引用子模块仓库的提交,该提交从未被推送到远程子模块URL:来自克隆的更新将:

  • 更新子模块引用
  • 尝试使用该引用更新子模块内容但失败。

您的队友确实推送了父回购更改(特别是子模块的新状态)但没有推送在该子模块内完成的提交。

看来您需要递归同步子模块。试试这个:

git submodule sync --recursive