当我尝试使用Sourcetree时,我得到了:
git -c diff.mnemonicprefix=false -c core.quotepath=false fetch origin
error: inflate: data stream error (unknown compression method)
fatal: loose object 982fcbfe3c97cec4319853db4e32bd77f72ae0bf (stored in .git/objects/98/2fcbfe3c97cec4319853db4e32bd77f72ae0bf) is corrupt
fatal: index-pack failed
我之前使用不同的字母/数字随机字符串收到此消息,并决定删除该特定文件然后我得到了这个。所以我假设如果我删除,拉动,删除,拉动等等,我最终会清除所有错误并能够拉动。
有没有办法立即解决所有这些错误?即。收紧这些物体,使它们不会产生“松散物体错误”。
为什么我会这样?成为松散物体实际上意味着什么?造成这种情况的可能原因是什么(即我做错了什么?)以及如何在将来避免这种情况?
编辑:似乎我的假设是错误的,删除其中几个文件并尝试再次拉动后,我得到Fatal: pack has 88 unresolved deltas
。 fatal: index-pack failed
。注意:如果他们仍然需要,我实际上并没有删除我刚将它们移走的文件。
答案 0 :(得分:1)
问题不在于对象是松散的(他们 "松散"但他们的反面是"包装",不是"收紧" 34;)而是它们被损坏(或者,一旦你移除它们,完全丢失)。
奇怪的名字如982fcbfe3c97cec4319853db4e32bd77f72ae0bf
实际上是SHA-1 ID,它们是"真正的名字"对象的对象,由git的SHA-1校验和代码(在git头上操作,后跟未压缩的数据)计算。由于SHA-1是加密校验和,因此名称本身会验证数据:打开文件,对其进行解压缩,并对结果数据运行校验和应生成相同的SHA-1。
不是,这意味着名称错误或存储的数据已损坏。这就是git自动检测损坏的方式(其中一种方法,但它们都基于相同的SHA-1校验和思想)。
这反过来意味着无论存储介质(本地磁盘,SSD,云存储,或者您使用的是什么)都存在缺陷:它无法正确存储您的文件。您需要首先处理此问题,然后继续修复您的存储库(通常是通过还原备份或从仍然具有良好版本的某个位置克隆副本)。
git存储库只是一个"对象存储"数据库用一些特殊的胶水。
git中的对象是四种文件类型之一:commit,tree,blob(file)或tag(带注释的标记)。
最初,每个对象分别存储在一个文件中,该文件的名称与对象的SHA-1校验和相匹配,git将其用作对象的名称。要从数据库中检索任何内容,您需要此名称;你将它赋予对象存储代码,并提取相关数据(如果需要,解压缩)。
即使压缩,对象也会占用大量磁盘空间,而许多对象(如源文件)与同一对象的其他版本类似。因此,为了节省更多磁盘空间,git可以" pack"一堆对象进入"包文件"。在一个包文件中,git相互压缩这些对象(这是" delta压缩"你现在看到的那个)。生成的包文件具有自己的SHA-1名称,git保存其中存储的所有对象的所有SHA-1 ID的索引。如果你向存储库对象提取器询问一个对象,它首先检查一个松散的对象;如果没有找到,它会检查包(通过它们的索引),并从那里提取它。