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

$ 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

有人能帮我解读一下吗?


当前回答

user1055643的答案缺少最后一步:

rm -fr .git
git init
git remote add origin your-git-remote-url
git fetch
git reset --hard origin/master
git branch --set-upstream-to=origin/master master

其他回答

最好的办法可能是简单地从远程存储库(即GitHub或其他)重新克隆。不幸的是,你将失去任何未推送的提交和隐藏的更改,但你的工作副本应该保持完整。

首先对本地文件进行备份。然后从你的工作树的根开始:

rm -fr .git
git init
git remote add origin [your-git-remote-url]
git fetch
git reset --mixed origin/master
git branch --set-upstream-to=origin/master master

然后根据需要提交任何更改过的文件。

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

我刚刚经历了这种情况——我的机器在写到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的。垃圾收集器将在适当的时候清除它们。

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

我是这样解决的: 我决定简单地将未损坏的对象文件从备份的克隆复制到原始存储库。这个方法同样有效。(顺便说一下:如果你在.git/objects/中找不到它的名字,它可能已经被[打包][包]以节省空间。)

对我来说,这是由于在做git推时发生的电源故障。

这些信息是这样的:

$ git status
error: object file .git/objects/c2/38824eb3fb602edc2c49fccb535f9e53951c74 is empty
error: object file .git/objects/c2/38824eb3fb602edc2c49fccb535f9e53951c74 is empty
fatal: loose object c238824eb3fb602edc2c49fccb535f9e53951c74 (stored in .git/objects/c2/38824eb3fb602edc2c49fccb535f9e53951c74) is corrupt

我尝试了git fsck之类的东西,但这没有帮助。 由于崩溃发生在git推送期间,它显然发生在客户端重写期间,发生在服务器更新之后。我环顾四周,发现c2388在我的例子中是一个提交对象,因为它是由.git/refs中的条目引用的。所以我知道,当我查看历史(通过web界面或第二个克隆)时,我将能够找到c2388。

在第二个克隆中,我执行了git log -n 2 c2388来识别c2388的前身。然后我手动修改了.git/refs/heads/master和.git/refs/remotes/origin/master作为c2388的前身,而不是c2388。 然后我可以进行git取回。 git获取失败了几次,因为空对象上的冲突。我删除了这些空对象,直到git获取成功。这已经修复了存储库。