git说"致命:被不稳定的对象源数据困惑"

jbf*_*ink 21 git

只是为了好玩,我试图将大约85GB的大约6MB二进制文件放入git中.Git突然出现了一段时间,但总是失败了一半的消息"致命:被不稳定的对象源数据混淆",然后是SHA1.你知道为什么吗?有没有办法解决它?

Chr*_*sen 23

  • 在您的操作过程中正在修改一个或多个文件,或
  • 某些东西导致不一致的读取(例如,硬件故障).

简短版本:Git的开发人员并不打算将其用于易失性文件.

由于Git用于"松散对象" 的布局*和它假设的有限文件系统语义**,Git必须知道新对象之前的对象名称(SHA-1)的第一个字节(两个十六进制字符)可以开始存储该对象.

*objects/[0-9a-f][0-9a-f]/目录.见gitrepository-layout.
**具体来说,它需要能够进行"原子"文件重命名.某些文件系统(通常是网络文件系统;特别是AFS,我相信)只保证重命名的源和目标位于同一目录中时重命名原子性.

目前,Git对每个文件进行两次SHA-1传递.第一遍用于检查Git是否已经知道文件的内容(对象存储中是否已存在SHA-1对象名).如果对象已存在,则不进行第二次传递.

对于新内容(对象尚未在对象存储中),在压缩和计算被压缩数据的SHA-1时,第二次读取该文件.如果初始SHA-1("已存储?"检查)与后面的SHA-1(压缩和写入的数据的哈希)匹配,则压缩数据将写入临时文件,该文件仅重命名为其最终的松散对象名称.如果这些SHA-1哈希值不匹配,那么Git会显示您正在查看和中止的错误消息.这个错误检查是在748af44c63中添加的,它首先在Git 1.7.0.2中发布.

  • 如果git说"致命:被不稳定的对象源数据混淆",接着是SHA1,然后是文件后面,那肯定会很好.非常讨厌它不告诉你什么文件是易变的...如果它确实我可以合理地将它或目录添加到我的.gitignore (11认同)
  • 那么这个解决方案是什么? (6认同)

小智 14

还有另一种可能性,即使是遥远的.这将是一个非常大的文件(例如3或更多gb)简单地说,git无法处理它.我们发现尝试在具有大文件的结构中创建存储库时出错