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

$ 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

有人能帮我解读一下吗?


当前回答

您不需要克隆,也不需要丢失未提交的更改。只需使用git rm -rf .git/删除。git文件夹,然后通过启动一个新的repo,设置remote和重置head来恢复git文件夹。我在这里添加了恢复已删除git文件夹的说明:

https://stackoverflow.com/a/67610397/7584643

其他回答

看起来您有一个损坏的树对象。您需要从其他人那里获取该对象。希望他们会有一个未损坏的版本。

如果您无法从其他人那里找到有效的版本,您可以通过猜测应该在那里的文件来重新构建它。您可能想要查看对象的日期和时间是否与它匹配。这些可能是相关的斑点。您可以从这些对象推断出树对象的结构。

看看Scott Chacon关于Git内部的截图。这将向您展示git在引子下是如何工作的,以及如果您真的卡住了,并且无法从其他人那里获得该对象,如何进行此侦探工作。

当我遇到这个问题时,我备份了我最近的更改(因为我知道我已经更改了什么),然后删除了它在.git/location中抱怨的文件。然后我做了一个“少不再来”的动作。不过要小心,这可能不适合你。

我也有同样的问题在我的裸远程git回购。经过大量的故障排除后,我发现我的一个同事提交了。git/objects中的一些文件的权限是440 (r—r-----),而不是444 (r—r—r—)。在让同事用“chmod 444 -R objects”在裸git repo中更改权限后,问题得到了解决。

运行git stash;Git stash pop解决了我的问题

我刚刚经历了这种情况——我的机器在写到Git回购时崩溃了,它被损坏了。我是这样修正的。

我首先查看有多少提交没有推送到远程回购,如下所示:

gitk &

如果你不使用这个工具,它是非常方便的——据我所知,在所有操作系统上都可用。这表明我的远程缺少两次提交。因此,我单击了指示最新远程提交的标签(通常是/remotes/origin/master)来获得哈希值(哈希值有40个字符长,但为了简洁起见,我在这里使用10个字符——这通常是可行的)。

下面就是:

14c0fcc9b3

然后我点击下面的提交(即远程没有的第一个),并获得哈希值:

04d44c3298

然后我使用这两个来为这次提交做一个补丁:

git diff 14c0fcc9b3 04d44c3298 > 1.patch

然后我对另一个缺失的提交也做了同样的处理,即我使用了之前提交的哈希值和提交本身的哈希值:

git diff 04d44c3298 fc1d4b0df7 > 2.patch

然后我移动到一个新的目录,从远程复制回购:

git clone git@github.com:username/repo.git

然后我将补丁文件移动到新文件夹中,应用它们并提交它们与它们确切的提交消息(这些可以从git日志或gitk窗口中粘贴):

patch -p1 < 1.patch
git commit

patch -p1 < 2.patch
git commit

这为我恢复了东西(注意,对于大量的提交,可能有更快的方法来做到这一点)。然而,我很想看看损坏的回购树是否可以修复,答案是可以。使用如上所述的修复的repo,在损坏的文件夹中运行这个命令:

git fsck 

你会得到这样的结果:

error: object file .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d is empty
error: unable to find ca539ed815fefdbbbfae6e8d0c0b3dbbe093390d
error: sha1 mismatch ca539ed815fefdbbbfae6e8d0c0b3dbbe093390d

要进行修复,我将在损坏的文件夹中这样做:

rm .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d
cp ../good-repo/.git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d

即删除损坏的文件,并用一个好的文件替换它。你可能要做几次。最后,你可以运行fsck而不会出现错误。你可能会在报告中出现“悬空提交”和“悬空blob”行,这是你在这个文件夹中重新创建和修改的结果,这是OK的。垃圾收集器将在适当的时候清除它们。

因此(至少在我的情况下)损坏的树并不意味着丢失未推送的提交。