2013-02-08 70 views
28

我在使用git子模块时遇到问题。无法签出git submodule路径

每当我接收从上游储存库中的新的子模块的参考,执行git submodule update给出以下结果:

fatal: reference is not a tree: dd208d46ecdd1ac0d2b2594a610fe4c9150fece1 
Unable to checkout 'dd208d46ecdd1ac0d2b2594a610fe4c9150fece1' in submodule path 'submodule/path' 

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

我的设置如下:

Git项目

遥控器:

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

子模块 “模块”,有遥控器:

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

有谁知道是什么原因造成我的问题?

回答

32

在做git submodule update,混帐试图检出提交/这是保存在超级项目树(在你的榜样,在一个同提交ID dd208d4...

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

也许你不得不

git submodule foreach git fetch 
git submodule update 

也许

git fetch --recurse-submodules 

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

你可以检查,是否有dd208d4...做一样的东西:

cd ./module 
git log dd208d46ecdd1ac0d2b2594a610fe4c9150fece1 
git cat-file -p dd208d46ecdd1ac0d2b2594a610fe4c9150fece1 
git ls-tree dd208d46ecdd1ac0d2b2594a610fe4c9150fece1 

一个可能的原因对于这样的问题,即一个谁公布从超级模块的新的承诺,也没有发布来自子模块的必要提交。他必须首先发布来自子模块的提交。

+0

子模块提交公布,仍然出现问题。 – Nuzzolilo

6

确保子模块被推有:

cd submodule-dir 
git push 

就我而言,我有:

  • 致力于子模块
  • 未按
  • 致力于父级更新子模块
  • 推送父级

所以这也难怪,它不能被发现。

它可以自动与推进一步:

git push --recurse-submodules=on-demand 

根据需要,或2.7开始也推子模块:

git config push.recurseSubmodules on-demand 
git push 
+0

基本上与以前相同的答案,但即使在推送时,有时仍会出现此问题。 – Nuzzolilo

+0

@Nuzzolilo您能生成一个最小的可重现的本地例子,例如'的mkdir回购&& CD回购&& git的初始化&&触摸&& git的添加.' ... –

+0

见https://github.com/projectkudu/kudu/issues/1972 - 可与通过在部署键访问子模块发生Github上。对不起,没有时间做更多的事情 – Nuzzolilo

1

我有同样的问题,我决定增加一个新的承诺父项目,并推全部Check the Subproject commit and commit from your module

0

我的问题是,我的回购cat .gitmodules,我指着错误的遥控器s ubmodule的回购(我原本是用原装遥控器克隆的,但后来转而使用它的一个分支; gitmodules文件从未更新以反映更改)。

0

我的问题是我必须在他们的build.gradle文件中的子模块(我认为被自动更改)提交的更改。他们出现在git diff。我刚刚做了git checkout .重置子模块回购没有任何更改,然后git submodule update工作。

0

刚刚看到这个问题时,我忘了推在我的子模块

的一个变化,确保更改推