Git push错误:目标文件为空/松散对象已损坏

时间:2016-05-19 02:23:28

标签: git

我试图使用Git Gui执行git提交。我上演了几个文件,然后由于电量不足,我的电脑突然关闭了。我将其插入,重新打开,并提交了我想要的文件。然后我跑了git push,就像我之前做了一百万次没有任何问题,这次我得到了以下错误:

Counting objects: 8, done.
error: object file .git/objects/b5/60c934f6bad40f4f246973afc0139ed91a2d32 is empty
Compressing objects: 100% (4/4), done.
error: object file .git/objects/b5/60c934f6bad40f4f246973afc0139ed91a2d32 is empty
fatal: loose object b560c934f6bad40f4f246973afc0139ed91a2d32 (stored in .git/objects/b5/60c934f6bad40f4f246973afc0139ed91a2d32) is corrupt
error: failed to push some refs to 'git@bitbucket.org:joemorano/app.git'

这可能是由于计算机在我执行第一次提交之前关闭了吗?

在所有这一切发生之前,我显然通过在我的服务器上以root身份运行bundle install来破坏我的应用程序的生产版本,现在服务器上的所有内容都搞砸了,但我不知道怎么可能影响本地版本。我从未做过git pull或类似的事情。

之前有人遇到此错误吗?

4 个答案:

答案 0 :(得分:6)

... failed to push some refs to 'git@bitbucket.org:joemorano/app.git'
     

这可能是由于计算机在我执行第一次提交之前关闭了吗?

当然,是的。

  

之前有人遇到此错误吗?

Repair corrupted git repository

另请参阅:How to fix corrupted git repository?

在这种情况下,由于您(可能)在bitbucket上有一个非损坏的备份,我首先将其克隆到一个新的(好的)克隆,然后看看我是否可以从中恢复任何中间提交和文件现有(坏)克隆和/或其工作树,将它们放入新的(好的)克隆中。一旦恢复了从坏克隆中恢复的任何内容,就可以放弃或删除它。 (根据您的计算机及其文件系统检查和修复工具,您可能也希望在执行任何其他操作之前运行它们。)

答案 1 :(得分:6)

第1步:备份.git(实际上我是在每个更改内容的步骤之间执行此操作,但使用新的副本名称,例如.git-old-1,.git-old -2等等):

cp -a .git .git-old

第2步:运行

git fsck --full

您将收到此错误消息

例如: 错误:目标文件.git / objects / 0A / dsdadadadaaeer4r3434343434334f为空

步骤3:删除上面的.git/objects/文件夹中的空文件。继续删除空文件。

步骤4:删除所有空文件后,现在运行

git fsck --full

第5步:尝试git reflog。失败,因为HEAD坏了。

第6步:手动获取reflog:

git log origin/master..HEAD

步骤7:请注意,从第6步开始,我们了解到HEAD当前指向最后一次提交。因此,让我们试着看看父提交:

git show commit-id 

步骤8:现在我们需要将HEAD指向commit-id

git update-ref HEAD commit-id

希望这对你有用。

答案 2 :(得分:1)

这是由于驻留在本地 .git 文件夹中的 head对象文件损坏了。

在启用以下命令后,可以查看以前的引用并追溯提交。

git symbolic-ref HEAD refs/remotes/origin/master // resetting to branch refs inside .git folder manually
git status // now we can use git log to find the latest commit. which will be clean to master.
git reflog  // to track back lost commit.
git reset HEAD@{5} // resetting hard to refs with the changes.

发现有时 diff更改存在,方法是通过 commit 进行重置,而不存在更改

因此,我们使用提交ID进行了软重置,并使用difftool手动设置了丢失的更改。

答案 3 :(得分:0)

**

苦苦挣扎后的简单解决方案

**

我遇到了类似的问题。

> $ git push error: object file
> .git/objects/65/05c1876d9c4f89b9f65949052af3495ae039cd is empty error:
> object file .git/objects/65/05c1876d9c4f89b9f65949052af3495ae039cd is
> empty error: object file
> .git/objects/65/05c1876d9c4f89b9f65949052af3495ae039cd is empty fatal:
> loose object 6505c1876d9c4f89b9f65949052af3495ae039cd (stored in
> .git/objects/65/05c1876d9c4f89b9f65949052af3495ae039cd) is corrupt
> error: remote unpack failed: eof before pack header was fully read

然后我刚刚删除了空对象文件

$ rm .git/objects/65/05c1876d9c4f89b9f65949052af3495ae039cd

我现在可以进行git push了。

$ git push
Enumerating objects: 41, done.
Counting objects: 100% (41/41), done.
Delta compression using up to 4 threads
Compressing objects: 100% (21/21), done.
Writing objects: 100% (22/22), 3.82 KiB | 1.91 MiB/s, done.
Total 22 (delta 15), reused 0 (delta 0)
remote:
remote: View pull request for feature/*BranchName*
> error: failed to push some refs to 'ssh://git@stash.xxx.com

我尝试过$git gc,尽管这使我删除了一些文件-请勿这样做