我有一个指向无效提交的子模块的项目:子模块提交仍然是本地的,当我试图从另一个repo获取它时,我得到:

$ git submodule update
fatal: reference is not a tree: 2d7cfbd09fc96c04c4c41148d44ed7778add6b43
Unable to checkout '2d7cfbd09fc96c04c4c41148d44ed7778add6b43' in submodule path 'mysubmodule'

我知道子模块HEAD应该是什么,有没有办法我可以在本地改变这个,而不从已经提交2d7cfbd09fc96c04c4c41148d44ed7778add6b43的回购?

我不确定我是否说清楚了…我发现了一个类似的情况。


当前回答

这个答案适用于终端git经验有限的SourceTree用户。

从Git项目(超级项目)中打开有问题的子模块。

获取并确保“获取所有标签”被选中。

重新建立你的Git项目。

这将解决“参考不是树”的问题十有八九。第一次不会,这是一个最终的解决方案,正如上面的答案所描述的那样。

其他回答

只是偶然发现了这个问题,这些解决方案都不适合我。我的问题的解决方案实际上要简单得多:升级Git。我的版本是1.7.1,在我升级到2.16.1(最新版本)后,这个问题就消失得无影无踪了!我就把它留在这里了,希望能帮到别人。

为了确保安全,请尝试更新git二进制文件。

GitHub for Windows的版本为git version 1.8.4.msysgit。对我来说,这就是问题所在。更新解决了这个问题。

当你有一个子模块指向一个重新基于的存储库,并且给定的提交“消失”时,也可能发生这种情况。虽然提交可能仍然在远程存储库中,但它不在分支中。如果你不能创建一个新的分支(例如,不是你的存储库),你就不得不更新超级项目来指向一个新的提交。或者,您可以将子模块的一个副本推到其他地方,然后更新超级项目以指向该存储库。

这个答案适用于终端git经验有限的SourceTree用户。

从Git项目(超级项目)中打开有问题的子模块。

获取并确保“获取所有标签”被选中。

重新建立你的Git项目。

这将解决“参考不是树”的问题十有八九。第一次不会,这是一个最终的解决方案,正如上面的答案所描述的那样。

此错误可能意味着子模块中缺少提交。也就是说,存储库(A)有一个子模块(B)。A想要加载B,以便它指向某个提交(在B中)。如果该提交以某种方式丢失了,你会得到这个错误。一个可能的原因:提交的引用被推入了A,但实际的提交并没有从b推入,所以我从那里开始。

不太可能的情况是,存在权限问题,无法提交(如果使用git+ssh,可能会出现这种情况)。

确保子模块在.git/config和.gitmodules中的路径看起来正常。

最后要尝试的一件事-在子模块目录:git reset HEAD -hard