我有一个指向无效提交的子模块的项目:子模块提交仍然是本地的,当我试图从另一个repo获取它时,我得到:
$ git submodule update
fatal: reference is not a tree: 2d7cfbd09fc96c04c4c41148d44ed7778add6b43
Unable to checkout '2d7cfbd09fc96c04c4c41148d44ed7778add6b43' in submodule path 'mysubmodule'
我知道子模块HEAD应该是什么,有没有办法我可以在本地改变这个,而不从已经提交2d7cfbd09fc96c04c4c41148d44ed7778add6b43的回购?
我不确定我是否说清楚了…我发现了一个类似的情况。
为了同步git repo与子模块的头部,如果这是你真正想要的,我发现删除子模块,然后读取它可以避免修补历史。不幸的是,删除子模块需要黑客攻击,而不是一个git命令,但这是可行的。
我所遵循的步骤是删除子模块,灵感来自https://gist.github.com/kyleturner/1563153:
运行git rm——cached
从.gitmodules文件中删除相关行。
从.git/config中删除相关的部分。
删除现在未跟踪的子模块文件。
删除目录。git/modules/
同样,如果您只想再次指向子模块的头部,并且不需要保持子模块的本地副本而使事情变得复杂,那么这可能很有用。它假设您拥有子模块“正确”作为它自己的repo,无论它的起源在哪里,您只是想返回到适当地将它作为子模块包含。
注意:在进行这些操作或任何git命令之前,除了简单的提交或推送之外,一定要对项目进行完整的复制。我建议所有其他的答案,以及作为一个通用的git指南。