如何修复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状态我得到:“错误:目标文件(…)是空的”“致命的:松散的对象(…)已损坏”
我解决这个问题的方法是:
- git存储
- 删除错误的git文件(不知道这是必要的)
- 混帐隐藏清除
我不知道到底发生了什么事,但是这些指示似乎使一切都变得清洁。
因为我必须定期重启我的虚拟机,所以不知何故这个问题经常发生在我身上。 经过几次之后,我意识到每次发生这种情况,我都不能重复@ 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 ,我们就完成了。
几次后,我相信你可以很快做到这一点。
- mv你的文件夹应用程序进行备份,即mv app_folder app_folder_bk(它就像一个混帐存储 )
- git clone your_repository
- 最后,。 打开一个合并工具(我使用meld diff查看器linux或Winmerge Windows),并从右侧( app_folder_bk )左侧(新app_folder )(这就像一个GIT存储应用 )复制的变化。
就这样。 也许这不是最好的方法,但我认为这是很实际的。
这是一个非常简单快捷的方法来处理这个问题, 如果你有一个本地回购所有的分支和提交你需要,如果你可以创build一个新的回购(或删除服务器的回购,并作出一个新的在它的地方):
- 在服务器上创build一个新的空回购(或删除旧的回购,并在其位置创build一个新的回购)
- 将本地副本的远程URL更改为指向新回购的远程URL。
- 将所有分支从本地回购推送到新的服务器回购。
这会保留您在本地回购中的所有提交历史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 stash
并git 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回购。
- 备份你的.git
- 检查你的混帐
- git fsck –full
- 删除空的对象文件(全部)
- rm .git / objects / 8b / 61d0135d3195966b443f6c73fb68466264c68e
- 再次检查你的git。
- git fsck –full
- 从远程git拉你的来源
- git拉来源高手
提交你的修改(如果有的话),然后把git reset --hard
如果你不关心保持你的历史提交,就跑
rm -r .git
然后回答是任何问题删除写保护的文件。 问题在一分钟内解决了。