如何修复GIT错误:目标文件是空的?

当我尝试提交更改时,出现此错误:

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 

我有一个类似的问题。 我的笔记本电脑在git操作过程中电池耗尽。 嘘。

我没有任何备份。 (NB Ubuntu One不是git的备份解决scheme,它将有助于覆盖已损坏的仓库)。

对于git向导,如果这是一个不好的方法来解决它,请留下评论。 但是,它确实为我工作,至less是暂时的。

第一步:做一个.git的备份(实际上,我在每一个改变内容的步骤之间做了这个工作,但是用一个新的拷贝来命名,例如.git-old-1,.git-old-2等等) :

 cp -a .git .git-old 

第2步:运行git fsck --full

 nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ 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步:删除空文件。 我想到了什么; 它的空白无论如何。

 nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ rm .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e rm: remove write-protected regular empty file `.git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e'? y 

第3步:再次运行git fsck 。 继续删除空文件。 你也可以进入.git目录并运行find . -type f -empty -delete -print find . -type f -empty -delete -print删除所有空文件。 最后Git开始告诉我,这实际上是在做对象目录的事情:

 nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ 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 

第4步:删除所有的空文件后,我最终来到git fsck实际运行:

 nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ 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 

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

 nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git reflog fatal: bad object HEAD 

第6步:Google。 find这个 。 手动获取reflog的最后两行:

 nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ 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当前正指向最后一个提交。 所以我们试着看一下父提交:

 nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ 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。

 nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git update-ref HEAD 9f0abf890b113a287e10d56b66dbab66adc1662d 

哪个没有抱怨。

第9步:看看fsck说:

 nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ 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步:caching树中无效的sha1指针看起来好像是来自(现在已过时的)索引文件( 源 )。 所以我杀了它,并重置回购。

 nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ rm .git/index nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ 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 …

 nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ 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 

晃来晃去的斑点并不是错误 。 我不关心master.u1冲突,现在它正在工作,我不想再碰它了!

第12步:赶上我的本地编辑:

 nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ 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") nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git commit -a -m "recovering from the git fiasco" [master 7922876] recovering from the git fiasco 3 files changed, 12 insertions(+), 94 deletions(-) nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git add tex/sept2012_code/example-code-testing.R nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ 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目标文件已经损坏(正如在其他答案中指出的那样)。 这可能发生在机器崩溃等

我有同样的事情。 在阅读其他最重要的答案后,我发现使用以下命令修复损坏的git存储库的最快捷方式(在包含.git文件夹的git工作目录中执行):

(请务必先备份您的git存储库文件夹!)

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

这将首先删除导致整个存储库损坏的空白对象文件 ,然后从远程存储库中提取缺失的对象 (以及最新的更改),然后执行完整的对象存储检查 。 在这一点上,应该没有任何错误地获得成功(虽然可能还有一些警告!)

PS。 这个答案表明你有一个git仓库的远程副本(例如,在GitHub上),而破损的仓库是与远程仓库连接的本地仓库。 如果情况并非如此,那么不要试图按照我的build议来修复它。

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

我发现现在甚至文件系统实现日志和其他“事务性”技术来保持fs健全,git可能因为电源故障或设备上的空间而损坏(并且不能自行恢复)状态,这让人感到失望。

当我推送我的提交和我的电脑挂起时,这个错误发生在我身上。 这是我已经修复它。


步骤来解决

 git status 

显示空的/损坏的目标文件

 rm .git/objects/08/3834cb34d155e67a8930604d57d3d302d7ec12 

去掉它

 git status 

我得到fatal: bad object HEAD消息

 rm .git/index 

我删除重置的index

 git reset 

致命的:无法parsing对象“HEAD”。

 git status git pull 

只是为了检查发生了什么

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

打印日志分支的最后2行tail -n 2以显示我的最后2个commit hash

 git update-ref HEAD 7221fa02cb627470db163826da4265609aba47b2 

我select最后一个commit hash

 git status 

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

 git reset 

继续重置

 git status 

validation我的修复


注意:当我登陆这个问题并使用答案作为参考时,这些步骤开始。

我只是有同样的问题:拉动遥远的存储库后,当我做了一个git状态我得到:“错误:目标文件(…)是空的”“致命的:松散的对象(…)已损坏”

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

  1. git存储
  2. 删除错误的git文件(不知道这是必要的)
  3. 混帐隐藏清除

我不知道到底发生了什么事,但是这些指示似乎使一切都变得清洁。

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

步骤1

将整个回购移到另一个文件夹。

 mv current_repo temp_repo 

第2步

再次从原点克隆回购。

 git clone source_to_current_repo.git 

第3步

删除.git文件夹以外的新回购。

步骤4

所有内容temp_repo移动到 .git文件夹之外的新回购。

第5步

删除temp_repo ,我们就完成了。

几次后,我相信你可以很快做到这一点。

  1. mv你的文件夹应用程序进行备份,即mv app_folder app_folder_bk(它就像一个混帐存储
  2. git clone your_repository
  3. 最后,。 打开一个合并工具(我使用meld diff查看器linux或Winmerge Windows),并从右侧( app_folder_bk )左侧(新app_folder )(这就像一个GIT存储应用 )复制的变化。

就这样。 也许这不是最好的方法,但我认为这是很实际的。

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

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

这会保留您在本地回购中的所有提交历史logging和分支。

如果你在repo上有合作者,那么我认为在很多情况下,你所有的协作者所要做的就是改变他们本地仓库的远程URL,并且可以select推送他们没有的那些提交。

当我遇到同样的问题时,这个解决scheme对我很有帮助。 我有一个合作者。 在我将本地仓库推到新的远程仓库后,他只是简单地将本地仓库改为指向远程仓库的仓库,一切正常。

在我的情况下,这个错误发生是因为我input了提交信息,笔记本电脑被closures。

我做了这些步骤来解决这个错误:

  • git checkout -b backup-branch #创build一个备份分支
  • git reset --hard HEAD~4 #重置为一切正常的提交。 就我而言,我不得不支持4次提交,直到我input提交消息之前,我的脑袋才到位。 在执行这一步之前,复制你将重置的提交的散列,在我的情况下,我复制了最后4个提交的散列
  • git cherry-pick <commit-hash> #从旧分支到新分支,樱桃select重置的提交(在本例中是4,所以我做了这个步骤4次)。
  • git push origin backup-branch #推新分支以确保一切正常
  • git branch -D your-branch #在本地删除分支('your-branch'是有问题的分支)
  • git push origin :your-branch #从远程删除分支
  • git branch -m backup-branch your-branch #重命名备份分支有问题的分支名称
  • git push origin your-branch #推新的分支
  • git push origin :backup-branch #从远程删除备份分支

我假设你有一个遥控器,所有相关的变化已经推到了它。 我不关心本地更改,只是想避免删除和recloning大型存储库。 如果你确实有重要的地方变化,你可能要更小心。

笔记本电脑坠毁后,我遇到了同样的问题。 可能是因为它是一个大型的仓库,我有不less腐败的目标文件,这些文件在调用git fsck --full的时候只出现一次,所以我写了一个小的shell来自动删除其中的一个:

$ sudo rm `git fsck --full 2>&1 | grep -oE -m 1 ".git/objects/[0-9a-f]{2}/[0-9a-f]*"`

  • 2>&1将错误消息redirect到stdout以便能够对其进行grep
  • 使用grep选项:
    • -o只返回实际匹配的行的一部分
    • -E启用高级正则expression式
    • -m 1确保只返回第一个匹配
    • [0-9a-f]{2}匹配0到9之间的任何字符,以及a和f,如果两个一起出现的话
    • [0-9a-f]*匹配0到9之间的任意数量的字符,a和f在一起

它一次只能删除一个文件,所以你可能需要像下面这样循环调用它:

$ while true; do sudo rm `git fsck --full 2>&1 | grep -oE -m 1 ".git/objects/[0-9a-f]{2}/[0-9a-f]*"`; done

这个问题是,它不会输出任何有用的东西,所以你不知道什么时候结束了(在一段时间后,它不应该做任何有用的事情)

为了“解决”这个问题,我在每一轮之后添加了一个git fsck --full的调用,如下所示: $ while true; do sudo rm `git fsck --full 2>&1 | grep -oE -m 1 ".git/objects/[0-9a-f]{2}/[0-9a-f]*"`; git fsck --full; done $ while true; do sudo rm `git fsck --full 2>&1 | grep -oE -m 1 ".git/objects/[0-9a-f]{2}/[0-9a-f]*"`; git fsck --full; done

现在快一半了,但是它输出的是“状态”。

在此之后,我在这个线程中的一些build议,最后到了一个地步,我可以git stashgit stash drop了很多破碎的东西。

第一个问题解决了

后来我还是遇到以下问题: unable to resolve reference 'refs/remotes/origin/$branch': reference broken ,可以通过$ rm \repo.git\refs\remotes\origin\$branch

$ git fetch

然后我做了一个$ git gc --prune=now

$ git remote prune origin

为了好的措施和

git reflog expire --stale-fix --all

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

将所有内容(包含.git的文件夹)复制到备份,然后删除所有内容并重新启动。 确保你有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:(master) git stash

上面介绍的十二步解决scheme也帮助我摆脱困境。 谢谢。 关键的步骤是input:git fsck –full

并删除所有空的对象

rm .git / objects / …

然后获取flog的两行:tail -n 2 .git / logs / refs / heads / master

用返回的值

git update-ref HEAD …

在这一点上,我没有更多的错误,所以我备份了我最近的文件。 然后做一个git pull然后git push。 复制我的备份到我的git仓库文件,并做了另一个git推送。 这让我目前。

如果你有一个老的备份,并且很着急:

做一个新的备份您的当前,破坏,项目path。

1 – 将你的.git移到垃圾桶(从不删除)
2 – 从旧备份中复制.git
3 – git pull (会造成合并冲突)
4 – 移动你的所有来源(你把所有的东西)垃圾: ./src (从不删除)
5 – 从NEW BACKUP中拷贝你所有的资源(你放在git中的所有东西)
6 – 接受所有的“合并”在git gui ,推和…拍手!

让我们去简单..只有情况下,你上传源远程git回购。

  1. 备份你的.git
  2. 检查你的混帐
    • git fsck –full
  3. 删除空的对象文件(全部)
    • rm .git / objects / 8b / 61d0135d3195966b443f6c73fb68466264c68e
  4. 再次检查你的git。
    • git fsck –full
  5. 从远程git拉你的来源
    • git拉来源高手

提交你的修改(如果有的话),然后把git reset --hard

如果你不关心保持你的历史提交,就跑

rm -r .git

然后回答是任何问题删除写保护的文件。 问题在一分钟内解决了。