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

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

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

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


当前回答

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

其他回答

为了同步git repo与子模块的头部,如果这是你真正想要的,我发现删除子模块,然后读取它可以避免修补历史。不幸的是,删除子模块需要黑客攻击,而不是一个git命令,但这是可行的。

我所遵循的步骤是删除子模块,灵感来自https://gist.github.com/kyleturner/1563153:

运行git rm——cached 从.gitmodules文件中删除相关行。 从.git/config中删除相关的部分。 删除现在未跟踪的子模块文件。 删除目录。git/modules/

同样,如果您只想再次指向子模块的头部,并且不需要保持子模块的本地副本而使事情变得复杂,那么这可能很有用。它假设您拥有子模块“正确”作为它自己的repo,无论它的起源在哪里,您只是想返回到适当地将它作为子模块包含。

注意:在进行这些操作或任何git命令之前,除了简单的提交或推送之外,一定要对项目进行完整的复制。我建议所有其他的答案,以及作为一个通用的git指南。

当我这样做时,我得到了这个错误:

$ git submodule update --init --depth 1

但是父项目中的提交指向了之前的提交。

删除子模块文件夹并运行:

$ git submodule update --init

并没有解决问题。我删除了回购,并再次尝试没有深度标志,它工作了。

此错误发生在Ubuntu 16.04 git 2.7.4中,但不会发生在Ubuntu 18.04 git 2.17中。

@pavan kumar在评论中写道:

我只是增加了深度计数以包括旧的提交,它起作用了。

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

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

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