由于缺少对象,Git损坏怎么办?

时间:2011-02-08 04:49:44

标签: git corruption

我刚刚在另一台远程服务器上克隆了一个存储库,并遇到了一个试图这样做的问题:

git clone git@codebasehq.com:blah/blah/docs.git
Cloning into docs...
remote: Counting objects: 343, done.
remote: error: unable to find 14f87a739828e4d489b0310a51e057b30333926e
remote: Compressing objects: 100% (325/325), done.
error: git upload-pack: git-pack-objects died with error.   
fatal: git upload-pack: aborting due to possible repository corruption on the remote side.
remote: fatal: unable to read 14f87a739828e4d489b0310a51e057b30333926e
remote: aborting due to possible repository corruption on the remote side.
fatal: early EOF
fatal: index-pack failed

我做了一些研究,发现了git fsck,这是输出:

$ git fsck --full
error: sha1 mismatch 14f87a739828e4d489b0310a51e057b30333926e

error: 14f87a739828e4d489b0310a51e057b30333926e: object corrupt or missing
missing blob 14f87a739828e4d489b0310a51e057b30333926e

所有其他有类似问题的人都有链接问题或其他问题。我对Git还是比较新的,有谁知道如何解决这个问题?

我仍然可以推送到我的中央远程存储库,但我无法克隆它。

14f87a739828e4d489b0310a51e057b30333926e是一个blob,它是存储库根目录中的markdown文件。我尝试删除此文件并推送这些更改无效。


修改:是否可以从其他仓库导入git历史记录?我想我可以启动一个新的仓库并将我的文件复制到其中,然后导入提交历史记录。

3 个答案:

答案 0 :(得分:3)

这是几乎相同的问题,有一个非常详细的解决方案:Github Repo Corruption - Sha1 Collision

答案 1 :(得分:3)

如果它只是一个文件并且尚未打包,您应该能够在本地存储库的.git/objects/14/f87a739828e4d489b0310a51e057b30333926e中找到它。您可以将此文件复制到服务器上存储库中的相应目录。

如果打包,您应该可以使用git unpack-objects.git/objects/pack/中的一个打包文件上解压缩。之后,复制到服务器的工作方式如上所述。

答案 2 :(得分:1)

简单推送不会解决这个问题,因为git看到它有提交引用损坏的文件并假设它具有所需的所有对象。

您是否有另一个存储库,该项目不会报告fsck的任何问题(并且有相关文件)?例如。在你的本地机器上?比你应该尝试:

  1. 将腐败的存放库放在一边。
  2. 克隆好的存储库。
  3. 将旧存储库中的任何分支从其他存储库或旧存储库中推送出来。
  4. 由于这种错误意味着磁盘上的文件已损坏,我建议你对文件系统,磁盘和内存进行彻底检查(当git是时,内存中的数据可能会被破坏拯救他们。)

    注意:虽然所有磁盘至少都有一些校验和,但大多数内存芯片都没有,所以内存故障比磁盘故障更容易被检测到。 memtest86+是检查记忆的好方法。