【问题标题】:Bad index file while in shared directory共享目录中的索引文件错误
【发布时间】:2017-10-30 09:16:24
【问题描述】:

我使用 VMWare 在 Windows 8 上使用 Ubuntu VM,而在使用 git 时出现错误

error: bad index file sha1 signature
fatal: index file corrupt

尝试commit时。

现在,我找到了解决此问题的方法(主要方法,删除 .git/index 并重试,似乎有点解决方法)但我想了解导致此错误的原因(部分原因是它们往往以随机方式工作)。

我做了一个实验,在~/(常规目录)和/mnt/hgfs/Shared with host/(与Windows 主机共享的目录,即我的笔记本电脑)中运行了几个命令。

在常规目录中它可以完美运行,但在共享目录中它失败,并在提交消息中出现上述错误。

命令是:

mkdir trial
cd trial
echo hello > world.txt
git init
git add .
git commit -m "msg"

现在我想知道,为什么共享目录很重要?
一般来说,是什么导致了这个错误?与哪个 sha1 签名相比是索引文件(运行tree .git 时我没有找到任何可以存储此类签名的东西)?

【问题讨论】:

  • 索引文件完全存储它自己的 SHA1 签名,以便它可以检测到它何时被损坏。它是索引文件本身的预告片。许多进行双向同步的共享文件系统平台最终会破坏 git 存储库。不要使用它们。
  • @EdwardThomson 他们如何破坏文件?如果他们将文件作为一个整体同步,我认为签名将保留,并且不会破坏任何内容......
  • 我不知道有关他们共享文件系统驱动程序的详细信息,以了解他们做错了什么。但从根本上说,它们是在模拟由 Windows NTFS 文件系统支持的类似 posix 的文件系统,感觉那里有很多锋利的边缘。

标签: git git-index shared-directory


【解决方案1】:

Edward Thomson's comment 是正确的——您可以从错误消息和the corresponding source code function verify_hdr 中看到这一点,其中包括以下几行:

git_SHA1_Init(&c);
git_SHA1_Update(&c, hdr, size - 20);
git_SHA1_Final(sha1, &c);
if (hashcmp(sha1, (unsigned char *)hdr + size - 20))
        return error("bad index file sha1 signature");

(魔术常数 20 是计算出的 SHA1 的字节大小)。

完全不清楚的是,在文件的共享中,是什么导致索引文件中的二进制数据被不当修改。但很明显它被不当修改了,这种VMWare共享机制不适用于这种情况。

【讨论】:

  • 是的,我也不知道到底出了什么问题。语义是标准的:打开索引锁定文件,写入它,将其作为新的索引文件原子地移动到位。如果我不得不猜测(我确实猜到了),VMWare 共享文件夹层(在 Windows 端)正在执行 I/O 并绕过文件系统锁定。 IIRC,这可能会给你一个撕裂的阅读,文件内容在你阅读时会发生变化,这听起来就像这里发生的事情。
  • 不管是什么原因——我同意——VMWare 共享机制不适用于这种情况,应该避免使用。
猜你喜欢
  • 2016-06-23
  • 1970-01-01
  • 2020-08-13
  • 2020-01-18
  • 2014-10-12
  • 1970-01-01
  • 1970-01-01
  • 2013-10-17
  • 2018-01-03
相关资源
最近更新 更多