Git无法签出到有空目录的提交(错误:无效对象160000;null sha1;致命:无法写入新索引文件)。

问题描述 投票:1回答:1

我的分支是 "dev"。最后一个分支 "dev "有一个空的文件夹libtai-mutoso,我在Windows下使用Gitbash。我使用Gitbash for Windows.我已经完成了另一个分支的工作,我试图将git切换到 "dev "分支。但是git没有签出。

$ git checkout dev -f
error: invalid object 160000 0000000000000000000000000000000000000000 for 'Src/time/libtai-mutoso'
error: invalid object 160000 0000000000000000000000000000000000000000 for 'Src/time/libtai-mutoso'
error: cache entry has null sha1: Src/time/libtai-mutoso
fatal: unable to write new index file

如何才能切换到dev分支呢? 谢谢各位高手的帮助

git checkout
1个回答
1
投票

最后一个分支dev有空文件夹libtai-mutoso。

git的字面意思是 不能 存储一个空文件夹,而你的却没有这样做。 发生的情况是,有人试图 窍门 储存一个空的文件夹......而这个技巧已经失败了。

有两个相关的窍门,都是在 如何将空目录添加到Git仓库? 一种是使用特殊的 空树 哈希,如 本回答. 这其实并不正确,正如答案本身所指出的那样。 另一种是使用 空子模块 如上所述 本回答. 这种方法 是否 工作(有一些限制)。

看来,不管是谁建立了你所克隆的版本库,并试图使用子模块技巧,但却弄错了。

子模块技巧利用的是,当 Git 存储一个子模块的信息时--即所谓的 "子模块"。git链接的实体,它是具有 mode 160000 中看到的错误信息--超级项目Git会创建一个目录文件夹,然后在您告诉它的时候,再做一个 .git 在该目录下克隆子模块,并使用子模块克隆在该目录下填充内容。

注意,这个新的目录文件夹 不是空的 归根结底:它包含了一个 .git,然后你的超级项目Git运行 git checkout 以及,在某些时候,用子模块中的某个提交内容来填充文件夹。 但这一切都发生在以后,当你告诉 Git 这样做的时候。 如果你从来没有告诉 Git 填写我的子模块它甚至从来没有进入到创建的步骤。.git.1

你的Git需要的信息,比如说你的超级项目Git应该克隆哪个Git仓库,以及之后应该检查出的提交,都包含在超级项目的两个地方。

  • 子模块仓库的名字和URL在以下地方 .gitmodules
  • 的提交哈希ID,即超级项目Git应该以 git checkout 子模块中,是你在上面错误信息中看到的哈希ID。

这个哈希ID 必须 是该子模块仓库中实际存在的某个提交的有效哈希 ID。 超级项目Git通常不会真正的 核对 它是有效的--反正现在还不是:这种检查稍后进行。 但有一种特殊情况,你刚刚也看到了。

具体来说,哈希ID 0000000000000000000000000000000000000000 (40个0)在Git中是保留的,称为 null hash IDnull sha1 在某些地方,包括你看到的错误信息。

error: cache entry has null sha1

一个缓存条目只有在一些特殊情况下才会有这个空的哈希ID,而这不是其中之一。

正确的信息需要在你的Git做一个 git checkout 的信息,这样您的 Git 就不会抱怨有问题而拒绝检查该提交。 但在你克隆的仓库中,你想签出的提交中的信息是错误的。

所以,总结一下问题:有人试图使用子模块的技巧,但弄错了。 结果是一个提交 你的 Git 拒绝签出。

我现在怎么才能切换到开发分支?

让做版本库的人停止错误地使用子模块。

你(和他们)最好的选择是不要去尝试存储一个空文件夹。 不值得这么麻烦。 如果他们想存储一个真正的子模块--这是有可能的--让他们修正他们的版本库,使它有一个正确的子模块。


1如果和当你 告诉你的超级项目Git更新子模块,如果你已经使用了使用 "空子模块 "的技巧,那就可以了,你克隆的仓库在其提交中没有文件。 该答案中的示例使用了提交 e84d7b81f0033399e325b8037ed2b801a5c994e0. 所以这个目录最后只有一个条目,名为 .git. 在现代Git中,这 .git 是一个包含一行的文件,在旧版Git中,它是一个包含空子模块仓库克隆的目录,其中包含一个没有文件的提交。 在Git的旧版本中,它是一个包含空子模块仓库克隆的目录,其中包含一个没有文件的提交。

© www.soinside.com 2019 - 2024. All rights reserved.