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

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

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

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


当前回答

在我看来,上面的答案都不能解决问题,尽管它们是很好的答案。所以我发布了我的解决方案(在我的例子中有两个git客户端,客户端A和B):

进入子模块的目录: cd子 结帐要掌握: Git checkout master 重基为两个客户端都能看到的提交代码 回到父目录: 致力于掌握 更改到另一个客户端,再次做rebase。 现在终于可以正常工作了!可能会丢失一些提交,但它是有效的。 仅供参考,不要试图删除你的子模块,它将保留在那里。git/modules,并且不能再次读取该子模块,除非响应式本地。

其他回答

你的分支可能不是最新的,一个简单的解决方案,但尝试git获取

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

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

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

无论如何,子模块的历史记录都安全地保存在子模块git中。

那么,为什么不直接删除子模块并重新添加它呢?

否则,您是否尝试手动编辑。git子模块中的HEAD或refs/master/ HEAD

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

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

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

重新建立你的Git项目。

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