如何处理损坏的 Git 对象文件?

问题描述 投票:0回答:10

当我接近配额时,我进行了 Git pull,结果(我认为)得到了一个损坏的文件:

$ git pull
walk dffbfa18916a9db95ef8fafc6d7d769c29a445aa
fatal: object d4a0e7599494bfee2b5351113895b43c351496b3 is corrupted

$ git fsck --full
bad sha1 file: .git/objects/66/b55c76947b1d38983e0944f1e6388c86f07a1b.temp
fatal: object d4a0e7599494bfee2b5351113895b43c351496b3 is corrupted

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

如何解决这种腐败问题?

.git/objects/66/b55c76947b1d38983e0944f1e6388c86f07a1b.temp 为零字节;删除它并不能解决我的问题(同样的错误)。

git
10个回答
78
投票

您可以使用“查找”命令删除

/objects
目录中大小为 0 的所有文件:

find .git/objects/ -size 0 -delete

建议备份


55
投票

一般来说,修复损坏的对象可能非常困难。然而,在这种情况下,我们确信问题是传输中止,这意味着该对象位于远程存储库中,因此我们应该能够安全地删除我们的副本并让 git 从远程正确获取它.

临时目标文件的大小为零,显然可以删除。这对我们没有任何好处。引用它的损坏对象,

d4a0e75...
,才是我们真正的问题。可以在
.git/objects/d4/a0e75...
中找到。正如我上面所说,删除它是安全的,但为了以防万一,请先备份它。

此时,新的

git pull
应该会成功。

...假设它一开始就会成功。在这种情况下,似乎某些本地修改阻止了尝试合并,因此

stash
pull
stash pop
是有序的。不过,任何合并都可能发生这种情况,并且与损坏的对象没有任何关系。 (除非需要进行一些索引清理,并且存储在此过程中做到了这一点......但我不相信如此。)


14
投票

从存储库损坏中恢复是官方答案。

真正简短的答案是:找到未损坏的对象并复制它们。


6
投票

对于遇到同样问题的任何人:

我通过在另一个位置再次克隆存储库解决了问题。然后,我将整个 src 目录(显然没有 .git 目录)从损坏的存储库复制到新克隆的存储库中。因此,我拥有了所有最近的更改和一个干净且有效的存储库。


5
投票

简单的解决方案:

  1. 删除
    .git
    文件夹
  2. 从 github 克隆您的项目
    git clone url
  • (克隆到工作文件夹之外,您只需要
    .git
    文件夹)
  1. .git
    文件夹剪切并粘贴到您的工作文件夹中
  2. 现在你可以添加 git commit
git add .
git commit -m 'update-project'
git push

1
投票

唯一对我有用的是删除 git 存储库并重新配置它:

rm -rf .git
git remote set-url origin <repo-url>

0
投票

我所做的是: 显示此存储库中的内容,确保您看到一个 .git 文件夹,(首先移动到根目录)

ls-a             
删除 .git 文件夹
须藤 rm -r .git             

创建并移动到一个新目录,您可以在其中临时存储您正在处理的存储库的新克隆。

cd../
mkdir t007
光盘T007

重新克隆您正在处理的存储库,然后导航到它

git克隆cloneSshUrlOfGitRepo
光盘名称Repo  

将 frech .git 文件夹从刚刚克隆的存储库移动到您有损坏对象并删除 .git 文件夹的存储库。 (在此步骤之后,您的旧存储库应该再次启动并运行,因为您用一个应该可以工作的新文件夹替换了损坏的 .git 文件夹)。

mv .git ../../nameOfRepo

现在您应该能够删除新克隆的存储库(因为您不再需要它,我们已经在上一步中移动了其工作 .git 文件夹)

cd../
sudo rm -r 存储库名称

现在您可以返回到出现此问题之前您正在处理的存储库。

cd ../nameOfRepo

0
投票

我已经解决了这个问题,只是硬重置原点:

git reset --hard origin/develop

始终建议备份,因为您需要将修改的文件复制到分支


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

0
投票

我用 git 查明对象描述了问题对象 r png 文件没有损坏,因为它们在预览/gimp 中加载..,我 git add 。暂存我当前的版本,但当我尝试加载到 smartgit 时,我收到了一条可爱的消息,git fsck 弹出相同的消息,直到上一次提交,一切都进展顺利

© www.soinside.com 2019 - 2024. All rights reserved.