37
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

4

5 回答 5

61

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

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

于 2012-11-16T23:38:00.240 回答
27

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

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

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

于 2014-03-04T21:55:24.143 回答
2

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

于 2016-02-07T01:41:54.213 回答
2

该错误意味着在克隆子模块时无法从任何引用访问特定提交(其 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
于 2016-07-31T20:56:58.353 回答
0

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

(你为什么这样做sudo?如果它属于 root,为什么你不在 root shell 中,如果不是,你为什么要更改为 root?)

于 2012-11-16T22:26:52.533 回答