每当我从我的遥控器,我得到以下关于压缩的错误。当我运行手动压缩,我得到相同的:

$ git gc
error: Could not read 3813783126d41a3200b35b6681357c213352ab31
fatal: bad tree object 3813783126d41a3200b35b6681357c213352ab31
error: failed to run repack

有人知道该怎么做吗?

从cat文件中我得到了这个:

$ git cat-file -t 3813783126d41a3200b35b6681357c213352ab31
error: unable to find 3813783126d41a3200b35b6681357c213352ab31
fatal: git cat-file 3813783126d41a3200b35b6681357c213352ab31: bad file

从git fsck中我得到了这个(不知道它是否真的相关):

$ git fsck
error: inflate: data stream error (invalid distance too far back)
error: corrupt loose object '45ba4ceb93bc812ef20a6630bb27e9e0b33a012a'
fatal: loose object 45ba4ceb93bc812ef20a6630bb27e9e0b33a012a (stored in .git/objects/45/ba4ceb93bc812ef20a6630bb27e9e0b33a012a) is corrupted

有人能帮我解读一下吗?


当前回答

我也有同样的问题(不知道为什么)。

此修复需要访问未损坏的存储库远程副本,并将保持本地工作副本的完整性。

但它也有一些缺点:

您将丢失任何未推送的提交记录,并且必须重新提交它们。 你会丢失所有的钱。

修复

从repo上面的父目录执行这些命令(将'foo'替换为项目文件夹的名称):

创建损坏目录的备份: cp -R foo foo-backup 创建远程存储库的新克隆到一个新目录: Git克隆Git @www.mydomain.de:foo foo-newclone 删除损坏的.git子目录: Rm -rf foo/.git 将新克隆的.git子目录移到foo中: mv foo-newclone /。git foo 删除临时新克隆的其余部分: Rm -rf foo-newclone

在Windows上,你需要使用:

copy而不是cp -R rmdir /S代替rm -rf 移动而不是mv

现在foo恢复了它原来的.git子目录,但所有的本地更改仍然在那里。Git状态、提交、拉取、推送等再次正常工作。

其他回答

简单地运行一个git修剪修复了这个问题

我在一台Windows 10电脑上遇到了类似的问题,其中一个驱动器备份了我的文档文件夹,其中有我的git存储库。

查看git对象目录中的对象,我没有看到绿色的复选标记,而是该文件的蓝色同步图标。所有其他目标文件似乎都有绿色的复选标记。玩周围,尝试的东西,我尝试选择选项始终保持此文件夹在此设备上,但得到一个错误:错误0x80071129标签存在于重解析点缓冲区是无效的。

这个链接(https://answers.microsoft.com/en-us/msoffice/forum/all/error-0x80071129-the-tag-present-in-the-reparse/b8011cee-98c5-4c33-ba99-d0eec7c535a0)建议以管理员身份运行chkdsk /r /f来解决这个问题(必须重新启动计算机)。我这么做了,问题就解决了。

我在写提交信息的时候电脑死机了。重新启动后,工作树就像我离开时一样,我能够成功提交我的更改。

然而,当我试图运行git状态时,我得到了

error: object file .git/objects/xx/12345 is empty
fatal: loose object xx12345 (stored in .git/objects/xx/12345 is corrupt

与大多数其他答案不同,我并没有试图恢复任何数据。我只是需要Git停止抱怨空对象文件。

概述

“目标文件”是Git对您所关心的实际文件的散列表示。Git认为它应该有一个/文件的散列版本。无论存储在.git/object/xx/12345中的是什么,修复这个错误基本上就是找出“松散对象”应该表示哪个文件的问题。

细节

可能的选择似乎是

删除空文件 将文件转换为Git可以接受的状态

方法1:删除目标文件

我尝试的第一件事就是移动object文件

mv .git/objects/xx/12345 ..

但这并没有起作用——Git开始抱怨断开的链接。关于方法二。

方法2:修复文件

Linus Torvalds写了一篇关于如何恢复目标文件的文章,为我解决了这个问题。这里总结了关键步骤。

$> # Find out which file the blob object refers to
$> git fsck
broken link from    tree 2d9263c6d23595e7cb2a21e5ebbb53655278dff8
           to    blob xx12345
missing blob xx12345

$> git ls-tree 2d926
...
10064 blob xx12345    your_file.whatever

这告诉你空对象应该是哪个文件的哈希值。现在你可以修理了。

$> git hash-object -w path/to/your_file.whatever

在这样做之后,我检查了. Git /objects/xx/12345,它不再是空的,Git停止抱怨。

在虚拟机上工作,在我的笔记本上,电池没电了,得到这个错误;

error: object file .git/objects/ce/theRef为空 文件.git/objects/ce/theRef是空的 (存储在.git/objects/ce/theRef中)已损坏

我设法让回购工作再次只有2个命令,而没有丢失我的工作(修改文件/未提交的更改)

find .git/objects/ -size 0 -exec rm -f {} \;
git fetch origin

在那之后,我运行了git状态,回购很好,有我的更改(等待提交,现在就做…)

Git版本1.9.1

请记住备份您所记得的所有更改,以防此解决方案不起作用,需要更激进的方法。

Felipe Pereira(上图)提供的解决方案,加上Stephan对我在对象被损坏时所在分支名称的回答的评论,对我来说是有效的。

find .git/objects/ -size 0 -exec rm -f {} \;
git fetch origin
git symbolic-ref HEAD refs/heads/${BRANCH_NAME}