git submodule update致命错误:引用不是树

bou*_*ppo 31 git version-control

user$ sudo git submodule update
fatal: reference is not a tree: a094dcfeeb43fcd62a9e466156e05e7581026f33
Unable to checkout 'a094dcfeeb43fcd62a9e466156e05e7581026f33' in submodule path 'client/src/util'
Run Code Online (Sandbox Code Playgroud)

我该怎么办?我只想从repo中获取最新代码的干净副本,我不介意丢失我的更改. 如你所知,我显然不确定发生了什么.我只能认为它正在尝试签出一个文件,这意味着git检测到本地计算机上文件的本地更改.

我目前正在使用OSX

Ada*_*ruk 54

这是子模块最常见的问题.您在外部存储库中进行的提交引用了子模块中有人未提升的提交.这是一个依赖性问题.始终从内到外推动.这很可能不是你做错了,而是在存储库中工作的其他人.它们很草率,忘了在子模块上发出推送,只是推送了包含的存储库.Stuff在他们的机器上运行,因为他们进行了更改并且那些提交存在于那里.打他们并告诉他们推高他们的子模块更改:)

否则,如果您在另一台机器上工作而忘记推动子模块更改,则可能是您的错.现在你在另一个地方,正在思考"WTF!这些是我的改变,他们也应该在这里工作!"

  • 这个答案涵盖了一个狭窄的场景 如果子模块来自第三方源(通用),并且已在本地向该第三方子模块发出更改,则实际上它们实际上不会被提交,因为它们将它们提交给第三方存储库.所以我在这种情况下,除了我无法在子模块上从本地提交我的更改,我只是想忽略它们.但是我仍然需要在生产中引入子模块,但是我得到了这个错误. (4认同)

Mic*_*nen 25

大多数情况下,Adam Dymitruk会描述这种情况,但另一种可能导致这种情况的情况是切换具有改变遥控器的子模块的分支.这是因为子模块更新只是尝试检查提交,但是在添加和获取新远程之前它将无法执行.

您可以通过查看.gitmodules文件并将子模块的URL与cd'ing到子模块所显示的URL进行比较来进行验证. git remote -v

在这种情况下,您需要运行git submodule sync以通知子模块有关远程更改,然后git submodule update --init --recursive解决此错误.