如何修复Git错误"对象文件…empty" ?

当我尝试提交更改时,我得到这个错误:

error: object file .git/objects/31/65329bb680e30595f242b7c4d8406ca63eeab0 is empty
fatal: loose object 3165329bb680e30595f242b7c4d8406ca63eeab0 (stored in .git/objects/31/65329bb680e30595f242b7c4d8406ca63eeab0) is corrupt

我尝试了git fsck,我得到:

error: object file .git/objects/03/dfd60a4809a3ba7023cbf098eb322d08630b71 is empty
fatal: loose object 03dfd60a4809a3ba7023cbf098eb322d08630b71 (stored in .git/objects/03/dfd60a4809a3ba7023cbf098eb322d08630b71) is corrupt

如何解决这个错误?

287660 次浏览

我也遇到过类似的问题。我的笔记本电脑在Git操作期间没电了。嘘。

我没有备份。(注意:Ubuntu One不是Git的备份解决方案;它将有助于覆盖你的健全的存储库与你的损坏。)

对于Git向导,如果这是一种糟糕的修复方法,请留下评论。然而,它确实对我有用……至少暂时是这样。

第一步:备份文件夹.(事实上,我在每一步之间都会做一些更改,但使用新的复制名称,例如.git-old-1.git-old-2等):

cd ~/workspace/mcmc-chapter
cp -a .git .git-old

步骤2:执行git fsck --full命令

git fsck --full


error: object file .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e is empty
fatal: loose object 8b61d0135d3195966b443f6c73fb68466264c68e (stored in .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e) is corrupt

步骤3:删除空文件。我想管他呢;反正是空白的。

rm .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e


rm: remove write-protected regular empty file `.git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e'? y

步骤3:再次执行git fsck命令。继续删除空文件。也可以将cd放入.git目录,然后运行find . -type f -empty -delete -print删除所有空文件。最终Git开始告诉我它实际上在对对象目录做一些事情:

git fsck --full


Checking object directories: 100% (256/256), done.
error: object file .git/objects/e0/cbccee33aea970f4887194047141f79a363636 is empty
fatal: loose object e0cbccee33aea970f4887194047141f79a363636 (stored in .git/objects/e0/cbccee33aea970f4887194047141f79a363636) is corrupt

第四步:在删除所有空文件后,我最终得到了git fsck实际运行:

git fsck --full


Checking object directories: 100% (256/256), done.
error: HEAD: invalid sha1 pointer af9fc0c5939eee40f6be2ed66381d74ec2be895f
error: refs/heads/master does not point to a valid object!
error: refs/heads/master.u1conflict does not point to a valid object!
error: 0e31469d372551bb2f51a186fa32795e39f94d5c: invalid sha1 pointer in cache-tree
dangling blob 03511c9868b5dbac4ef1343956776ac508c7c2a2
missing blob 8b61d0135d3195966b443f6c73fb68466264c68e
missing blob e89896b1282fbae6cf046bf21b62dd275aaa32f4
dangling blob dd09f7f1f033632b7ef90876d6802f5b5fede79a
missing blob caab8e3d18f2b8c8947f79af7885cdeeeae192fd
missing blob e4cf65ddf80338d50ecd4abcf1caf1de3127c229

第五步:尝试git reflog。失败是因为我的头坏了。

git reflog


fatal: bad object HEAD

步骤6:谷歌。发现# EYZ0。手动获取reflog的最后两行:

tail -n 2 .git/logs/refs/heads/master


f2d4c4868ec7719317a8fce9dc18c4f2e00ede04 9f0abf890b113a287e10d56b66dbab66adc1662d Nathan VanHoudnos <nathanvan@gmail.com> 1347306977 -0400    commit: up to p. 24, including correcting spelling of my name
9f0abf890b113a287e10d56b66dbab66adc1662d af9fc0c5939eee40f6be2ed66381d74ec2be895f Nathan VanHoudnos <nathanvan@gmail.com> 1347358589 -0400    commit: fixed up to page 28

步骤7:注意,从步骤6中我们了解到HEAD当前指向最后一次提交。让我们看一下父commit

git show 9f0abf890b113a287e10d56b66dbab66adc1662d


commit 9f0abf890b113a287e10d56b66dbab66adc1662d
Author: Nathan VanHoudnos <nathanvan@XXXXXX>
Date:   Mon Sep 10 15:56:17 2012 -0400


up to p. 24, including correcting spelling of my name


diff --git a/tex/MCMC-in-IRT.tex b/tex/MCMC-in-IRT.tex
index 86e67a1..b860686 100644
--- a/tex/MCMC-in-IRT.tex
+++ b/tex/MCMC-in-IRT.tex

它工作!

第8步:现在我们需要将HEAD指向9f0abf890b113a287e10d56b66dbab66adc1662d。

git update-ref HEAD 9f0abf890b113a287e10d56b66dbab66adc1662d

它没有抱怨。

步骤9:看看fsck说了什么:

git fsck --full


Checking object directories: 100% (256/256), done.
error: refs/heads/master.u1conflict does not point to a valid object!
error: 0e31469d372551bb2f51a186fa32795e39f94d5c: invalid sha1 pointer in cache-tree
dangling blob 03511c9868b5dbac4ef1343956776ac508c7c2a2
missing blob 8b61d0135d3195966b443f6c73fb68466264c68e
missing blob e89896b1282fbae6cf046bf21b62dd275aaa32f4
dangling blob dd09f7f1f033632b7ef90876d6802f5b5fede79a
missing blob caab8e3d18f2b8c8947f79af7885cdeeeae192fd
missing blob e4cf65ddf80338d50ecd4abcf1caf1de3127c229

第10步:缓存树中无效的sha1指针看起来像是来自索引文件()。所以我杀了它,重置了存储库。

rm .git/index
git reset


Unstaged changes after reset:
M    tex/MCMC-in-IRT.tex
M    tex/recipe-example/build-example-plots.R
M    tex/recipe-example/build-failure-plots.R

步骤11:再次查看fsck…

git fsck --full


Checking object directories: 100% (256/256), done.
error: refs/heads/master.u1conflict does not point to a valid object!
dangling blob 03511c9868b5dbac4ef1343956776ac508c7c2a2
dangling blob dd09f7f1f033632b7ef90876d6802f5b5fede79a

# EYZ0。我不关心主人。u1conflict,现在它工作了,我不想再碰它了!

第12步:跟进我的本地编辑:

git status


# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#    modified:   tex/MCMC-in-IRT.tex
#    modified:   tex/recipe-example/build-example-plots.R
#    modified:   tex/recipe-example/build-failure-plots.R
#
< ... snip ... >
no changes added to commit (use "git add" and/or "git commit -a")




git commit -a -m "recovering from the git fiasco"


[master 7922876] recovering from the git fiasco
3 files changed, 12 insertions(+), 94 deletions(-)


git add tex/sept2012_code/example-code-testing.R
git commit -a -m "adding in the example code"


[master 385c023] adding in the example code
1 file changed, 331 insertions(+)
create mode 100644 tex/sept2012_code/example-code-testing.R

我只是有同样的问题:在拉远存储库后,当我做了git status,我得到:

&;error: object file(…)is empty"

.“致命:松动物体(…)已损坏”

我解决这个问题的方法是:

  1. # EYZ0
  2. 错误地删除Git文件(我不确定这是必要的)
  3. # EYZ0

我不知道到底发生了什么,但这些指示似乎让一切都变得干净了。

复制所有内容(在包含.文件夹的文件夹中)到备份,删除所有内容,然后重新启动。确保你手边有Git遥控器:

git remote -v
origin    git@github.com:rwldrn/idiomatic.js.git (fetch)
origin    git@github.com:rwldrn/idiomatic.js.git (push)

然后

mkdir mygitfolder.backup
cp mygitfolder/* mygitfolder.backup/
cd mygitfolder
rm -r * .git*
git init
git remote add origin git@github.com:rwldrn/idiomatic.js.git

然后手动合并任何新文件,并试着让你的电脑开着。

我解决了这个问题,删除了git fsck正在检测的各种空文件,然后运行一个简单的Git拉取。

我感到失望的是,现在甚至文件系统都实现了日志记录和其他“事务”。技术来保持文件系统正常,Git可能会因为设备上的电源故障或空间而进入损坏状态(并且不能自行恢复)。

  1. 移动您的应用程序文件夹进行备份,即mv app_folder app_folder_bk(它就像git藏)
  2. # EYZ0
  3. 最后,打开一个合并工具(我在Linux上使用融合差异查看器,在Windows上使用WinMerge),并将更改从右(app_folder_bk)复制到左(新的app_folder)(它就像Git stash应用)。

这是所有。也许这不是最好的方法,但我认为它很实用。

在我的例子中,出现这个错误是因为我正在输入提交消息,而我的笔记本关机了。

我执行了以下步骤来修复错误:

  • git checkout -b backup-branch #创建备份分支
  • git reset --hard HEAD~4 #重置到所有工作正常的提交。在我的例子中,我必须在head中回退四次提交,也就是说,直到我的head在我输入提交消息之前。# EYZ1。
  • git cherry-pick <commit-hash> #樱桃选择从旧分支到新分支的重置提交(在我的情况下是四次提交,所以我做了四次这个步骤)。
  • git push origin backup-branch #推动新的分支,以确保一切正常工作
  • git branch -D your-branch #在本地删除分支('your-branch'是有问题的分支)
  • git push origin :your-branch #从远程删除分支
  • 将备份分支重命名为出现问题的分支的名称
  • git push origin your-branch #推新分支
  • git push origin :backup-branch #从远程删除备份分支

我从一个干净的分支机构退房后也遇到了同样的问题。

过了一段时间,我在master中发现了很多修改过的文件。我不知道为什么他们一直在那里,从一个干净的分支切换。不管怎样,因为修改后的文件对我来说没有意义,我只是把它们藏起来,错误就消失了。

# EYZ0

这里有一个非常简单和快速的方法来处理这个问题如果你有一个本地回购与所有的分支和提交你需要的,如果你可以创建一个新的回购(或删除服务器的回购,并在它的位置上创建一个新的):

  1. 在服务器上创建一个新的空回购(或删除旧的回购并在其位置上创建一个新的回购)
  2. 将本地副本的远程URL更改为指向新回购的远程URL。
  3. 将所有分支从本地回购推到新的服务器回购。

这将保存您在本地回购中拥有的所有提交历史和分支。

如果你在回购上有合作者,那么我认为在很多情况下,你的合作者所要做的就是改变他们本地回购的远程URL,并有选择地推送任何他们拥有的服务器没有的提交。

当我遇到同样的问题时,这个解决方案对我很有效。我有一个合作者。在我将本地回购推到新的远程回购后,他只是将本地回购更改为指向远程回购URL,一切都正常工作。

这个错误发生在我推动我的提交和我的计算机挂起。

这就是我解决它的方法。


修复步骤

git status

显示空/损坏的目标文件

rm .git/objects/08/3834cb34d155e67a8930604d57d3d302d7ec12

删除它

git status

我收到fatal: bad object HEAD消息

rm .git/index

我删除了index进行重置。

git reset

无法解析对象“HEAD”。

git status
git pull

看看发生了什么

tail -n 2 .git/logs/refs/heads/MY-CURRENT-BRANCH

它输出log分支的最后两行,tail -n 2,来显示最后两行,提交散列

git update-ref HEAD 7221fa02cb627470db163826da4265609aba47b2

我选择最后一个commit hash

git status

它显示我所有的文件为删除,因为我删除了.git/index文件

git reset

继续复位

git status

验证我的修复

Git对象文件已经损坏(正如在其他回答中指出的那样)。这可能发生在机器崩溃等情况下。

我也有同样的问题。在阅读了这里的其他顶级答案之后,我发现了用以下命令修复损坏的Git存储库的最快方法(在包含.git文件夹的Git工作目录中执行):

(请务必先备份Git存储库文件夹!)

find .git/objects/ -type f -empty | xargs rm
git fetch -p
git fsck --full

这将首先导致整个存储库损坏的删除任何空的目标文件,然后是来自远程存储库的取回丢失的对象(以及最新的更改),然后是完整的对象存储检查。在这一点上,它应该成功而没有任何错误(尽管仍然可能有一些警告!)

< p > p。这个答案表明您拥有Git存储库的远程副本 在某个地方(例如在GitHub上),损坏的存储库是本地存储库,它绑定到仍然完整的远程存储库。如果不是这样,那么不要尝试用我建议的方法来修复它

因为我必须定期重启我的虚拟机,不知何故这个问题经常发生在我身上。几次之后,我意识到我不能每次都重复由Nathan Vanhoudnos描述的过程,尽管它总是有效的。然后我想出了以下更快的解决方案。

步骤1

将整个存储库移动到另一个文件夹。

mv current_repository temp_repository

步骤2

再次从原点克隆存储库。

git clone source_to_current_repository.git

步骤3

除了.文件夹之外,在新的存储库中删除一切

步骤4

一切temp_repository移动到新存储库除了.文件夹。

步骤5

删除temp_repository,我们就完成了。

几次之后,我相信你可以很快地完成这些步骤。

Nathan VanHoudnos报道 12步解决方案也帮助我摆脱了困境。谢谢。关键步骤是进入:

git fsck --full

并移除所有空对象

rm .git/objects/...

然后有两行诗:

tail -n 2 .git/logs/refs/heads/master

返回值

git update-ref HEAD ...

此时,我已经没有错误了,所以我备份了最近的文件。然后执行Git pull和Git push。我将备份复制到Git存储库文件中,并进行了另一次Git推送。那让我有了电流。

如果你有备份,并且很着急:

为你当前的、Git-broken的项目路径做一个新的备份

  1. 移动你的.git到垃圾(永远不要删除)
  2. 备份中复制.git
  3. git pull(将创建合并冲突)
  4. 移动你所有的源代码(所有你放在Git中的东西)到垃圾:./src(从不删除)
  5. 新的备份复制所有的源代码(您放入Git中的所有内容)
  6. 接受所有“合并”;在git gui,按和…拍拍手!

我假设你有一个遥控器,所有相关的变化已经推送到它。我不关心本地更改,只是希望避免删除和重新克隆大型存储库。如果你确实有重要的局部更改,你可能要更加小心

我的笔记本电脑死机后,我也遇到了同样的问题。 可能是因为它是一个很大的存储库,我有相当多的损坏的目标文件,在调用git fsck --full时一次只出现一个,所以我写了一个小的shell一行程序来自动删除其中一个:

# EYZ0

  • 2>&1将错误消息重定向到标准输出,以便能够grep
  • grep选项使用:
  • -o只返回一行中实际匹配的部分
  • -E启用高级正则表达式
  • -m 1确保只返回第一个匹配项
  • [0-9a-f]{2}匹配0到9之间的任何字符,如果其中两个字符同时出现,则匹配a和f
  • [0-9a-f]*匹配0到9之间且a和f同时出现的任意数量的字符

它一次仍然只删除一个文件,所以你可能想在循环中调用它,就像:

# EYZ0

这样做的问题是,它不再输出任何有用的东西,所以您不知道它什么时候完成(一段时间后它应该不会做任何有用的事情)。

< p >“fix"然后我只是在每一轮之后添加了一个git fsck --full的调用,如下所示: # EYZ0 < / p >

它现在的速度大约是原来的一半,但它确实输出了它的“状态”。

在此之后,我在回答中使用了一些建议,最终达到了可以git stashgit stash drop很多破碎的东西的程度。

第一个问题解决了

之后我仍然有以下问题: unable to resolve reference 'refs/remotes/origin/$branch': reference broken,可以通过 # EYZ0 < / p >

# EYZ0

然后我做了一个 # EYZ0 < / p >

# EYZ0

为了更好地衡量

# EYZ0

当运行git fsck --full时,取消error: HEAD: invalid reflog entry $blubb

让我们简单点…只有在将源代码上传到远程Git存储库的情况下

  1. 备份.文件夹

  2. 检查Git仓库

     git fsck --full
    
  3. 删除空对象文件(全部)

     rm .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e
    
  4. 再次检查Git存储库。

     git fsck --full
    
  5. 从远程Git存储库中提取源代码

     git pull origin master
    

我遇到了同样的问题,我用了一个非常简单的方法来解决它。我发现那些丢失的文件存在于我队友的电脑上。

一份一份拷贝了那些文件到Git服务器(总共9个文件),这解决了这个问题。

我和我的同事多次遇到同样的问题,为了解决这个问题,我们简单地按照下面描述的步骤来做。这不是最优雅的解决方案,但它不会丢失数据。

  1. 重命名当前工作目录。(本例为old_project)。
  2. 使用git clone在新目录中克隆存储库。
  3. 在命令行上,将工作目录更改为新创建的项目,并切换到您一直在工作的分支。
  4. 复制old_project中的所有文件和目录(除了.git目录)到新创建的项目目录。
  5. 检查您的工作树状态(注意有比您期望的更多的更改),然后提交更改。

我希望它能有所帮助……

如果你在github.com上的公共存储库正常工作,但你的本地存储库损坏,这里有一种解决问题的方法。请注意,您将丢失在本地存储库中所做的所有提交。

好吧,所以我有一个本地存储库,给我这个object empty error,和相同的存储库在github.com,但没有这个错误。因此,我所做的只是从GitHub克隆存储库,然后从损坏的存储库中复制所有内容(除了.文件夹),并将其粘贴到正在工作的克隆存储库中。

这可能不是一个实用的解决方案(因为您删除了本地提交),但是,您维护代码和修复的版本控制。

请记住在应用此方法之前进行备份。

这解决了我的问题:

git stash
git checkout master
cd .git/ && find . -type f -empty -delete
git branch your-branch-name -D
git checkout -b your-branch-name
git stash pop

我修复了我的git错误:对象文件是空的:

  1. 保存我上次成功提交/推送后编辑的所有文件的副本,
  2. 删除并重新克隆我的存储库,
  3. 用我编辑过的文件替换旧文件。

在我的例子中,保存本地提交历史对我来说并不重要。所以,如果这也适用于你,你可以这样做,作为上述解决方案的快速替代方案:

基本上,您只需将损坏的.git/目录替换为一个干净的目录。

让我们假设包含损坏Git文件的项目位于以下目录:projects/corrupt_git/

  1. cp projects/corrupt_git projects/backup -(可选)进行备份
  2. git clone [repo URL] projects/clean_git -这样你就得到了projects/clean_git
  3. rm -rf corrupt_git/.git/ -删除损坏的.文件夹
  4. mv clean_git/.git/ corrupt_git/ -移动干净的git到corrupt_git/.git
  5. git statusprojects/corrupt_git -确保它工作

我在使用虚拟机时经常遇到这个问题。

对我来说,以下工作:

cd /path/to/your/project
rm -rf .git

如果你想为自己保存一些下载-进入文件资源管理器,删除文件夹中已经提交的所有文件,并保留在/供应商/ node_modules(我使用PHP的作曲家npm)文件夹中。

然后创建一个新的存储库:

git init

添加遥控器

git remote add origin ssh://git@github.com/YourUsername/repoName.git

然后去取树枝/全部

git fetch origin somebranch

大家来看看

git checkout somebranch

那么你应该在错误之前的点。

这种情况也经常发生在我身上。我还没有制定具体的协议,但我怀疑每当我的虚拟机 (VM)“意外”存在时就会发生这种情况。如果我关闭虚拟机窗口(我使用Ubuntu 18.04(仿生海狸))并重新开始,事情总是(?)工作。但是如果当我的笔记本电脑关闭(Windows主机系统)时,虚拟机窗口仍然打开,那么我经常遇到这个问题。

对于这里给出的所有答案:

  1. 谢谢-它们非常有用;我通常保存代码的本地副本,从远程恢复存储库,并将备份副本移回本地文件夹。

  2. 作为潜在的问题不是真正的Git问题,而是虚拟机和/或Linux问题,我想知道是否不应该有一种方法来治愈原因,而不是症状?这种错误不表明某些文件系统更改没有“应用”吗?在任何合理的时间,但只缓存?(参见示例 Linux下的文件编辑是否直接保存到磁盘?< / >)——对我来说,似乎虚拟Linux机器没有足够频繁地同步它们的东西。这是Oracle的VirtualBox(在其他方面工作得很好)的问题,还是客户文件系统的问题,或者是一些我们都忽略的设置的问题,超出了我的专业范围。但如果有人能解释清楚,我会很高兴。

事实上,我也有同样的问题。

在尝试此操作之前,请准备一份代码副本。

我刚刚做了 # EYZ0 < / p >

我的最后一次承诺也没有兑现。然后我又犯了一次,问题就解决了!

在一个脚本中

#! /bin/sh


# Save Git data
cp -r .git gitold


# Remove all empty Git object files
find .git -type f -empty -delete -print


# Get the current branch name
branchname=$(git branch --show-current)


# Get the latest commit hash
commit=$(tail -2 .git/logs/refs/heads/$branchname | awk '{ print $2 }' | tr -d '[:space:]')


# Set HEAD to this latest commit
git update-ref HEAD $commit


# Pull the latest changes on the current branch (considering remote is origin)
git pull origin $branchname


echo "If everything looks fine you remove the git backup running :\n\
$ rm -rf gitold \n\
Otherwise restore it with: \n\
$ rm -rf .git; mv gitold .git"

在我的虚拟机崩溃和Git文件损坏后,我也有同样的问题。

第一步,从项目的根文件夹。

find .git/objects -type f -empty -delete

然后是西梅和fetch…

git prune
git fetch --all --prune

然后做了一些回滚,然后就开始工作了。

在这种情况下,我通过遵循这个问题来解决我的问题。

  1. 从存储库目录中删除。git文件夹。(为安全起见保留备份)
  2. 克隆我的回购在另一个目录。
  3. 从新的克隆目录复制.git文件夹。
  4. 粘贴到之前出现问题的目录中。

检查git状态,希望你能看到你所有的变化。现在你可以承诺并推进了。

这个问题的解决方法很简单

•找到那个文件

•就像我的情况一样

error: object file .git/objects/f1/a0e726cd3505a9be8dffaa78077dfe3a497eaf is empty
fatal: loose object f1a0e726cd3505a9be8dffaa78077dfe3a497eaf (stored in .git/objects/f1/a0e726cd3505a9be8dffaa78077dfe3a497eaf) is corrupt
然后简单地删除它 a0e726cd3505a9be8dffaa78077dfe3a497eaf < /强> # EYZ0

rm .git/objects/f1/a0e726cd3505a9be8dffaa78077dfe3a497eaf

修复git对象错误解决方案 只需执行以下命令

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






Refresh index: 100% (5322/5322), done.
error: object file .git/objects/d4/f989f0e5f4613a3cbba836b3c77dfb71a7a56c is empty
error: object file .git/objects/d4/f989f0e5f4613a3cbba836b3c77dfb71a7a56c is empty
error: object file .git/objects/d4/f989f0e5f4613a3cbba836b3c77dfb71a7a56c is empty
fatal: loose object d4f989f0e5f4613a3cbba836b3c77dfb71a7a56c (stored in .git/objects/d4/f989f0e5f4613a3cbba836b3c77dfb71a7a56c) is corrupt