Why does git submodule update fail with "fatal: remote error: upload-pack: not our ref"?

Why does git submodule update fail with "fatal: remote error: upload-pack: not our ref"?

我有一个包含多个子模块的 git 存储库。我尝试删除和添加有问题的子模块 (scopatz's nanorc),但是在删除和重新添加过程中错误仍然存​​在。当我将 repo 克隆到新位置时,我会自动使用 git submodule update --init --recursive 更新它,这是失败的时候,但仅针对此子模块... 以下是 GIT_TRACE=2:

命令的相关输出
23:01:26.918691 run-command.c:1569      run_processes_parallel: preparing to run up to 1 tasks
23:01:26.933567 run-command.c:1601      run_processes_parallel: done
23:01:26.934373 run-command.c:646       trace: run_command: git gc --auto
23:01:26.966805 git.c:344               trace: built-in: git gc --auto
23:01:26.991059 git.c:344               trace: built-in: git rev-parse --local-env-vars
23:01:27.015684 git.c:344               trace: built-in: git rev-parse --local-env-vars
23:01:27.032282 git.c:344               trace: built-in: git symbolic-ref -q HEAD
23:01:27.053948 git.c:344               trace: built-in: git config --get branch.master.remote
23:01:27.073636 git.c:344               trace: built-in: git fetch origin 151d94a8754b0a612315fc191c5373cc0055c13d
23:01:27.079657 run-command.c:646       trace: run_command: git-remote-https origin https://github.com/scopatz/nanorc.git
23:01:28.441725 run-command.c:646       trace: run_command: git rev-list --objects --stdin --not --all --quiet
23:01:28.452267 run-command.c:646       trace: run_command: git fetch-pack --stateless-rpc --stdin --lock-pack --thin https://github.com/scopatz/nanorc.git/
23:01:28.467757 git.c:344               trace: built-in: git fetch-pack --stateless-rpc --stdin --lock-pack --thin https://github.com/scopatz/nanorc.git/
fatal: remote error: upload-pack: not our ref 151d94a8754b0a612315fc191c5373cc0055c13d
fatal: The remote end hung up unexpectedly
Fetched in submodule path 'submodules/nano', but it did not contain 151d94a8754b0a612315fc191c5373cc0055c13d. Direct fetching of that commit failed.

希望这里有人能提供帮助,我现在几乎迷路了。

=== 编辑:下面的解决步骤===

cd {submodule path}
git reset --hard origin/master
cd -
git clean -n
git add {submodule path}
git commit
git submodule update --init --recursive

没有错误,太棒了。

使用 Git 和子模块,您从至少两个 Git 存储库开始。一个是 "your" 存储库——主要的存储库,Git 将调用 超级项目。第二个 Git 存储库是另一个 Git 存储库:它没有什么特别之处。只是你的超级项目里面有这两部分:

  • 克隆子模块的说明。这可以让你的 Git 运行 git clone 如果需要,例如在 git submodule update --init 期间。

  • 一些提交的原始哈希 ID 应该是 其他 Git 存储库中。您的主存储库将在克隆或 运行ning git fetch 之后(如果合适)克隆另一个 Git 存储库,运行 git 检出<em>哈希</em> 使用此原始哈希 ID。

您的超级项目正在请求 Git 存储库中的哈希 ID 151d94a8754b0a612315fc191c5373cc0055c13d,您可以从 https://github.com/scopatz/nanorc.git 克隆该存储库。该提交 根本不存在 在该存储库中,因此它也不在您创建的任何克隆中。

你知道为什么你的超级项目列出了这个提交哈希 ID,即使它不存在吗? (我当然不知道。)您无法从他们的 Git 那里获得它,因为他们没有。这就是所有这些错误消息告诉您的内容。

您可以尝试在其他存储库(或 Google)中搜索 151d94a8754b0a612315fc191c5373cc0055c13d(我刚刚尝试使用 Google,但他们找不到)。或者,如果你真的不特别关心 that 提交,试着告诉你自己的 Git——你的超级项目——它应该得到一些 other 提交,确实 存在,因此你可以 得到。

您应该 提交哪个提交?我不知道:这取决于你。请注意, 您的超级项目列出子模块的原始提交哈希的位置是:在每个提交中。您可以 git checkout 在您的超级项目中进行一些提交,可能是某个分支的尖端。然后你可以进入子模块,选择一个你喜欢的提交,在那个子模块中使用 git checkout——毕竟它是另一个 Git 克隆,所以你可以在那里执行任何 Git 命令——来检查出所需的提交。然后,退出子模块(将目录更改回您的超级项目)和子模块路径上的 运行 git addgit commit 以记录新的所需哈希 ID。这个新提交现在要求 那个 特定的哈希 ID。

当我尝试更新我在分支某些子模块之前创建的分支上的子模块时,我遇到了这个问题。 所以我有 repo1 branch-x,它有一些子模块, 并且只有在某些子模块上创建了 branch-x 之后。 我的解决方案是循环子模块并重置分支:

cd the-main-repo-dir
foreach submodlue in submodules do {
   cd {submodule path}
   git reset --hard origin/brnach-x
   cd -
}
git submodule update --init --recursive
git push origin/branch-x

如果您没有完全提交并推送您对子模块的本地更改,就会发生这种情况。

我在使用子模块克隆我们的一个存储库时遇到了这个错误,而原来的本地存储库工作正常。问题是因为我忘记了推送子模块的更改。

因此,请确保提交并推送您所有的子模块更改。

我的子模块也有同样的错误。由于该项目是公开可用的,为了解决这个问题,我将 .git/config 中的 url 和它们各自的子模块配置中的所有值替换为项目 https 而不是 ssh

如果您提交了子模块

...那么一个常见的问题就是你

  • ...添加到超级项目的提交,
  • 推超级项目,
  • 但是没有推送子模块。

所以在您的本地工作区中一切都很好,但是超级项目指的是远程计算机上(还)不存在的子模块提交。这个事实导致了这条消息。

解决方案

git push --recurse-submodules=on-demand

请试试这个git submodule foreach --recursive git reset --hard