首页 > 解决方案 > 推送递归子模块 - 上传包:不是我们的参考

问题描述

尝试推送到生产环境时会抛出此错误

remote: Cloning into '/var/www/domain.com/php/repo/api/log'...
remote: fatal: remote error: upload-pack: not our ref fdbef7944df6b5e83715f8679395a852dc5faf5e
remote: Fetched in submodule path 'php/repo/api/log', but it did not contain fdbef7944df6b5e83715f8679395a852dc5faf5e. Direct fetching of that commit failed.

回购路径

php/repo/api
php/repo/api/log <-- the repo nested inside another repo

挂钩/接收后

#/bin/sh
cd /var/www/domain.com
git --work-tree=. --git-dir=/var/git_repos/domain.com.git checkout master -f
git --work-tree=. --git-dir=/var/git_repos/domain.com.git submodule update --init --recursive

标签: git

解决方案


您已指示另一个 Git(您服务器上的 Git)克隆一个子模块,它确实这样做了。无法回答它在哪里获得子模块,但大概它使用您的.gitmodules文件获取第三台服务器的 URL,并git clone使用该 URL 运行以在您的服务器上创建子模块存储库。

在服务器上创建或更新了该子模块后,您可以让服务器的子模块的 Git 尝试签出特定的提交,即哈希 ID 为fdbef7944df6b5e83715f8679395a852dc5faf5e. 您的服务器的子模块存储库中没有fdbef7944df6b5e83715f8679395a852dc5faf5e。这可能是因为从该服务器上的子模块克隆的第三台服务器也没有它。

这很难理解,但如果我们给每个 Git 存储库命名,我们可以更容易理解。总共至少有 5 个存储库:

  • 您有一个超级项目存储库;我们称他为弗雷德。
  • 您的超级项目有一个子模块。我们叫她威尔玛。
  • 您的服务器有一个 Git 存储库,它也充当超级项目。我们称他为 Barney,尽管他实际上主要是 Fred 的克隆(反之亦然)。
  • 您的服务器有一个作为子模块的 Git 存储库。我们称它为贝蒂。
  • 当然,Betty 自己也是一个克隆(因为所有 Git 存储库都是克隆)。她是谁的克隆人?那是我不知道的(但你可以通过你的.gitmodules文件找到/控制),但我们称她为 Ann Margrock

这里发生的事情是你在 Fred 中做了一个新的提交。这个新的提交要求 Wilma 或 Betty 作为子模块使用 commit fdbef7944df6b5e83715f8679395a852dc5faf5e。据推测,您确实fdbef7944df6b5e83715f8679395a852dc5faf5e在 Wilma 中做出了承诺。

然后,您将 Git 从 Fred 推送到 Barney。Barney 现在有一个提交,需要fdbef7944df6b5e83715f8679395a852dc5faf5e从他的子模块提交。但他的子模块是贝蒂。

为了得到 fdbef7944df6b5e83715f8679395a852dc5faf5e,贝蒂可以给安·玛格洛克打个电话。但如果安没有fdbef7944df6b5e83715f8679395a852dc5faf5e,贝蒂也不会得到 fdbef7944df6b5e83715f8679395a852dc5faf5e。当巴尼命令贝蒂退房时fdbef7944df6b5e83715f8679395a852dc5faf5e,她会抱怨,说她不能那样做。

解决方案是提交 commit fdbef7944df6b5e83715f8679395a852dc5faf5e,不是给 Barney ,也不是给 Betty ,而是给Ann,因为 Betty 打电话给 Ann 来得到它。所以找出谁在这里代表安,并确保威尔玛发送fdbef7944df6b5e83715f8679395a852dc5faf5e给安。


推荐阅读