如何修复GIT错误:对象文件是空的?

sim*_*imo 408 git

当我尝试提交更改时,我收到此错误:

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

不知道如何解决这个错误?

编辑

我试过git fsck我有:

error: object file .git/objects/03/dfd60a4809a3ba7023cbf098eb322d08630b71 is empty
fatal: loose object 03dfd60a4809a3ba7023cbf098eb322d08630b71 (stored in .git/objects/03/dfd60a4809a3ba7023cbf098eb322d08630b71) is corrupt
Run Code Online (Sandbox Code Playgroud)

Nat*_*nos 845

我遇到了类似的问题.我的笔记本电脑在git操作期间没电了.嘘.

我没有任何备份.(注意:Ubuntu One不是git的备份解决方案;它将有助于用您损坏的存储库覆盖您的理智存储库.)

对于git向导,如果这是一个不好的修复方法,请发表评论.然而,它确实对我有用......至少是暂时的.

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

cp -a .git .git-old
Run Code Online (Sandbox Code Playgroud)

第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
Run Code Online (Sandbox Code Playgroud)

第3步:删除空文件.我想到了什么; 无论如何它的空白.

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

第3步:git fsck再次运行.继续删除空文件.您也可以cd进入该.git目录并运行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
Run Code Online (Sandbox Code Playgroud)

第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
Run Code Online (Sandbox Code Playgroud)

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

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git reflog
fatal: bad object HEAD
Run Code Online (Sandbox Code Playgroud)

第6步:Google.找到这个.手动获取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
Run Code Online (Sandbox Code Playgroud)

步骤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
Run Code Online (Sandbox Code Playgroud)

有效!

步骤8:所以现在我们需要将HEAD指向9f0abf890b113a287e10d56b66dbab66adc1662d.

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git update-ref HEAD 9f0abf890b113a287e10d56b66dbab66adc1662d
Run Code Online (Sandbox Code Playgroud)

哪个没有抱怨.

第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
Run Code Online (Sandbox Code Playgroud)

步骤10:缓存树中的无效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
Run Code Online (Sandbox Code Playgroud)

第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
Run Code Online (Sandbox Code Playgroud)

晃来晃去斑点不是错误.我不关心master.u1conflict,现在它正在工作我不想再触摸了!

第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
Run Code Online (Sandbox Code Playgroud)

所以希望将来可以对人们有所帮助.我很高兴它奏效了.

  • 优秀的答案,以及所有步骤和所有.我想你用谷歌搜索了我的每一个! (83认同)
  • 像魅力一样工作!我希望我能多次投票;) (23认同)
  • 真棒,真棒的答案.特别感谢您在每个步骤背后包含您的推理.你救了我的回购!(好吧,我仍然有来自fsck的'错误refs/heads/master'错误,但是相对较轻.) (13认同)
  • 谢谢你,先生.你是一个学者和绅士 (11认同)
  • 谢谢,我学到了很多关于git功能的知识,同时也节省了我的培根重要提交!巧合的是,这也是因为笔记本电脑电池电量不足. (3认同)
  • 有时投票感觉还不够。stackoverflow 应该真正实现发送拥抱 (2认同)
  • 我们可以给这个人颁发诺贝尔奖什么的吗?当我的可移动设备意外被移除时,我弄得一团糟,我很惊喜地发现我能够用这个食谱清理它。你摇滚! (2认同)

Mar*_*jur 162

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

我有同样的事情.在阅读了其他热门答案之后,我找到了使用以下命令修复损坏的git存储库的最快方法(在包含该.git文件夹的git工作目录中执行):

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

find .git/objects/ -type f -empty | xargs rm
git fetch -p
git fsck --full
Run Code Online (Sandbox Code Playgroud)

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

PS.这个答案建议您在某处(例如,在GitHub上)拥有git存储库的远程副本,而破坏的存储库是与远程存储库绑定的本地存储库,该存储库仍处于机智状态.如果不是这样,那么不要试图按照我推荐的方式修复它.

  • 在关闭我正在使用git repo的VM之后出现此问题.该解决方案完美无缺. (7认同)
  • 这是比其他方法更快的修复方法。谢谢。 (4认同)
  • 谢谢你,我非常虔诚地推送到我的远程分支,你的解决方案对我有用。我首先尝试了下面的@mCorr,但是在我提交新文件后,存储库恢复到已损坏的状态。这个方法解决了 (3认同)
  • 谢谢马丁,优秀而紧凑的解决方案。尽管我可能会将 PS 放在第一位,并以粗体显示警告,以防止天真的用户在本地设置上尝试相同的操作。就像 Giscard 一样,当我关闭虚拟机时就会出现这种情况......如果我找到比每次都这样做更永久的解决方案,我会更新。 (3认同)
  • 第一个命令可以简单地是 `find .git/objects/ -type f -empty -delete` ;) (3认同)
  • VM crush对我当地的git repo做了这个,我可以确认这个解决方案在这种情况下100%正常工作 (2认同)

Sim*_*nni 33

我解决了这个删除git fsck正在检测的各种空文件,然后运行一个简单的git pull.

我发现令人失望的是,即使文件系统实现日志和其他"事务"技术以保持fs理智,git也可能因为电源故障或设备空间而进入损坏状态(并且无法自行恢复).

  • 我确信上面的答案在技术上更好,但它在第6步停止工作,并且在技术上超出了我的头脑.权宜之计是git pull (3认同)
  • 我遇到了一个情况,在做了Nathan的回答(效果很好!)的说明的步骤1-11后,我有一个错误,说refs/origin/master和refs/origin/head没有定义(或类似的东西)那).git pull固定了.所以我认为两种解决方案一起工作. (2认同)
  • 我知道所使用的文件系统通常仅记录元数据。您也可以为数据打开日记功能,但是由于开销(?),我猜它不是默认设置。这可能是文件为空的原因。...文件系统通常会观察每个文件的事务,而git有多个文件正在修改每个事务,因此即使fs保持每个文件的一致性,如果git不保持一致,那么我猜git会导致状态不一致... (2认同)

mar*_*rlo 32

当我按下提交并且计算机挂起时,这个错误发生在我身上.这是我修复它的方式.


修复的步骤

git status
Run Code Online (Sandbox Code Playgroud)

显示空/损坏的目标文件

rm .git/objects/08/3834cb34d155e67a8930604d57d3d302d7ec12
Run Code Online (Sandbox Code Playgroud)

去掉它

git status
Run Code Online (Sandbox Code Playgroud)

我收到了fatal: bad object HEAD消息

rm .git/index
Run Code Online (Sandbox Code Playgroud)

我删除index了重置

git reset
Run Code Online (Sandbox Code Playgroud)

致命:无法解析对象'HEAD'.

git status
git pull
Run Code Online (Sandbox Code Playgroud)

只是为了检查发生了什么

tail -n 2 .git/logs/refs/heads/MY-CURRENT-BRANCH
Run Code Online (Sandbox Code Playgroud)

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

git update-ref HEAD 7221fa02cb627470db163826da4265609aba47b2
Run Code Online (Sandbox Code Playgroud)

我选了最后一个 commit hash

git status
Run Code Online (Sandbox Code Playgroud)

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

git reset
Run Code Online (Sandbox Code Playgroud)

继续重置

git status
Run Code Online (Sandbox Code Playgroud)

验证我的修复


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


小智 11

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

对我来说,有以下作品:

cd /path/to/your/project
rm -rf .git
Run Code Online (Sandbox Code Playgroud)

如果您想节省一些下载,请进入文件资源管理器并删除文件夹中已提交的所有文件,并将其保留在/vendor/node_modules(我使用PHP Composernpm)文件夹中。

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

git init
Run Code Online (Sandbox Code Playgroud)

添加您的遥控器

git remote add origin ssh://git@github.com/YourUsername/repoName.git
Run Code Online (Sandbox Code Playgroud)

并获取分支/全部

git fetch origin somebranch
Run Code Online (Sandbox Code Playgroud)

并检查一下

git checkout somebranch
Run Code Online (Sandbox Code Playgroud)

那么您应该处于错误之前的位置。


小智 8

我有同样的问题:拉远的仓库,当我做了git的状态后,我得到了:"错误:目标文件(...)为空","致命的:宽松的对象(...)已损坏"

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

  1. git stash
  2. 错误地删除git文件(不确定是否有必要)
  3. git stash clear

我不确切知道发生了什么事,但这些指示似乎让一切都干净了.

  • 我总是喜欢简单的答案:)对于这里的步骤2,我使用了@Nathan VanHoudnos的答案中提供的命令:`cd .git / &amp;&amp; find。类型f-空-删除` (2认同)

小智 8

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

步骤1

将整个仓库移动到另一个文件夹.

mv current_repo temp_repo
Run Code Online (Sandbox Code Playgroud)

第2步

再次从原点克隆回购.

git clone source_to_current_repo.git
Run Code Online (Sandbox Code Playgroud)

第3步

除了.git文件夹之外,删除新repo下的所有内容.

第4步

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

第5步

删除temp_repo,我们完成了.

几次之后,我确信你可以很快完成这个程序.

  • 或者不要移动当前的仓库,1)创建一个新的克隆`git clone source_to_current_repo.git clean_repo`,2)备份旧的.git文件夹,3)复制干净的.git文件夹. (2认同)

Rap*_*yol 6

在一个脚本中

#! /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"
Run Code Online (Sandbox Code Playgroud)


小智 5

  1. mv您的文件夹应用程序进行备份,即mv app_folder app_folder_bk(它就像一个git藏匿处)
  2. git clone your_repository
  3. 最后,.打开合并工具(我使用meld diff viewer linux或Winmerge Windows)并将更改从右侧(app_folder_bk)复制到左侧(新的app_folder)(它就像一个git stash apply).

就这样.也许这不是最好的方式,但我认为它是如此实用.