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

Posted

技术标签:

【中文标题】git submodule update 致命错误:引用不是树【英文标题】:git submodule update fatal error: reference is not a tree 【发布时间】:2012-11-05 16:37:08 【问题描述】:
user$ sudo git submodule update
fatal: reference is not a tree: a094dcfeeb43fcd62a9e466156e05e7581026f33
Unable to checkout 'a094dcfeeb43fcd62a9e466156e05e7581026f33' in submodule path 'client/src/util'

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

我目前正在使用 OSX

【问题讨论】:

Git submodule head 'reference is not a tree' error 的可能重复项 【参考方案1】:

您的子模块存储库很可能没有引用外部存储库的修订。它也可能在为子模块指定的远程不可用,或者您没有为子模块设置远程。您可以尝试在其中进入client/src/utilgit fetch

(你为什么sudo它?如果它属于root,为什么你不在root shell中,如果不是,你为什么要切换到root?)

【讨论】:

我使用的是 Mac,默认情况下我似乎必须 sudo 它才能进行写入 @bouncingHippo,不,除非您搞砸了权限,否则 mac 不需要 sudo。因此,你有:)【参考方案2】:

这是子模块最常见的问题。您在外部存储库中的提交引用了子模块中尚未有人推送的提交。这是一个依赖问题。始终从内向外推动。这很可能不是您做错了什么,而是在存储库中工作的其他人。他们马虎,忘记在子模块上发布推送,只是推送了包含的存储库。 Stuff 在他们的机器上工作,因为他们进行了更改并且那些提交存在那里。去打他们一巴掌,告诉他们推动他们的子模块更改:)

否则,如果您在另一台机器上工作并且忘记推送子模块更改,则可能是您的错。现在您在另一个位置并且正在思考“发生了什么!这些是我的更改,它们也应该在这里工作!”

【讨论】:

我必须推送子模块更改,还是有办法忽略子模块更改?s 你不能发出子模块更新命令。但是如果你有依赖于它的代码,事情就不会起作用。 这对我来说不是问题的原因。我绝对推动了子模块的提交。我可以在任何我希望的机器上手动克隆外部并“更新”子模块。但是在我设置的 VisualStudio.com 云构建代理上,它失败并显示相同的错误消息。不知道为什么。 这个答案涵盖了一个狭窄的场景。如果子模块来自第 3 方源(常见),并且更改已在本地发布到该第三方子模块,那么它们实际上不能总是被提交,因为它们会将它们提交到第 3 方 repo。所以我在这种情况下,除了我不能在子模块上从本地提交我的更改,我只想忽略它们。但是我仍然需要在生产中引入子模块,但是我得到了那个错误。 这正是我的问题——我没有推送子模块提交。【参考方案3】:

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

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

在这种情况下,您需要运行 git submodule sync 来通知子模块远程更改,然后运行 ​​git submodule update --init --recursive 以消除此错误。

【讨论】:

Git 与其用户之间存在对抗关系。谢谢你帮我赢了,这一次。【参考方案4】:

除了 Adam Dymitruk 和 Michael Chien 的回答之外,由于 Windows 最大路径长度,我遇到了这个问题。如果我尝试在我的Documents/Visual Studio 2013/Projects 目录中克隆具有 3 级深度子模块的特定存储库,那么我会得到fatal: reference is not a tree。但是如果我在我的主目录中重复相同的克隆,它就可以正常工作。

【讨论】:

【参考方案5】:

该错误意味着在克隆子模块时无法从任何引用访问特定提交(其 sha1),因此您应该使用有效引用更新子模块或将更改重置为最新版本。

当您在本地分支中进行了新提交,或者您包含了对分离的 HEAD 的引用,但您没有将它们推送到子模块 git URL 指向的主存储库中时,可能会发生这种情况。

要手动将子模块重置为源/主,输入子模块的子目录并进行重置,例如

cd client/src/util
git reset origin/master --hard

如果您想更正主仓库中的引用,请在执行上述操作后提交更改:

# Still in submodule dir.
git pull origin master # In submodule dir.
git push origin master
cd - # Go back to the main repo dir.
git status
git commit -am 'Update submodule refs'
git push

如果您想将引用从 fork 拉取并推送到 origin,您可以尝试:

cd client/src/util # Go to submodule dir again.
git remote add fork git@github.com:example/foo.git
git pull fork master
git show a094dcfeeb43fcd62a9e466156e05e7581026f33 # Check previously missing sha1. 
git push origin master:master # Or: master:some_branch

【讨论】:

以上是关于git submodule update 致命错误:引用不是树的主要内容,如果未能解决你的问题,请参考以下文章

git submodule update时Permission denied 错误解决

git submodule update --init --recursive

git submodule update --init --recursive

git submodule update --init --recursive

Can‘t find third_party/gtest. Run git submodule update --init, or disable with CMake -DBUILD_TEST(代码

git submodule