无法签出git子模块路径

Ric*_*uin 34 git git-submodules

使用git子模块时遇到问题.

每当我从上游存储库收到一个新的子模块引用时,执行git submodule update会给出以下结果:

fatal: reference is not a tree: dd208d46ecdd1ac0d2b2594a610fe4c9150fece1
Unable to checkout 'dd208d46ecdd1ac0d2b2594a610fe4c9150fece1' in submodule path 'submodule/path'
Run Code Online (Sandbox Code Playgroud)

重要的是要注意子模块有几个遥控器,其中上游遥控器应该用于更新子模块参考树.我猜我的问题在那里,但我不确定.

我的设置如下:

Git项目

遥控器:

  1. origin (我的git fork)
  2. upstream (项目回购)

子模块"模块",有遥控器:

  1. origin (我的git fork)
  2. upstream (项目回购)

有谁知道是什么导致了我的问题?

tha*_*ler 37

这样做时git submodule update,git会尝试签出保存在超级项目中的提交/树(在您的示例中,具有提交ID的那个dd208d4...)

我认为你得到错误,因为在子模块中没有这样的对象存在.你必须确保它在那里.通常这意味着您必须首先从远程获取/拉取它.

可能你必须这样做

git submodule foreach git fetch
git submodule update
Run Code Online (Sandbox Code Playgroud)

或者可能

git fetch --recurse-submodules
Run Code Online (Sandbox Code Playgroud)

假设配置了子模块,以便它可以从远程获取丢失的提交origin.最后,必须知道,从哪里可以获取丢失的提交,您必须得到它.

您可以dd208d4...通过执行以下操作来检查:

cd ./module
git log dd208d46ecdd1ac0d2b2594a610fe4c9150fece1
git cat-file -p dd208d46ecdd1ac0d2b2594a610fe4c9150fece1
git ls-tree dd208d46ecdd1ac0d2b2594a610fe4c9150fece1
Run Code Online (Sandbox Code Playgroud)

造成这种问题的一个可能原因是,从超级模块发布新提交的人没有从子模块发布必要的提交.他必须首先从子模块发布提交.


Cir*_*四事件 7

确保已按下子模块

cd submodule-dir
git push
Run Code Online (Sandbox Code Playgroud)

在我的情况下,我有:

  • 致力于子模块
  • 没推
  • 使用更新的子模块向父级提交
  • 推了父母

所以难怪它无法找到.

然后,如果您使用的是诸如GitHub之类的Web界面,您还可以转到子模块存储库网页,并仔细检查您需要的提交是否显示在那里.

push.recurseSubmodules on-demand

可以通过以下方式进一步自动推送:

git push --recurse-submodules=on-demand
Run Code Online (Sandbox Code Playgroud)

它还根据需要推送子模块,或者从2.7开始:

git config push.recurseSubmodules on-demand
git push
Run Code Online (Sandbox Code Playgroud)