git错误:对象文件为空(object-file-is-empty)的解决方案

git错误:对象文件为空(object-file-is-empty)的解决方案


背景介绍


在日常开发过程中我们可能因为操作不当导致git版本库出问题,最经常出的一个问题就是对象文件为空错误object-file-is-empty,一般提示如下所示:

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

最优解决方案


1.运行 git fsck --full

luyi@ubuntu:~/projects/example$ git fsck --full
error: object file .git/objects/3a/60046cdd45cf3e943d1294b3cb251a63fb9552 is empty
error: object file .git/objects/3a/60046cdd45cf3e943d1294b3cb251a63fb9552 is empty
fatal: loose object 3a60046cdd45cf3e943d1294b3cb251a63fb9552 (stored in .git/objects/3a/60046cdd45cf3e943d1294b3cb251a63fb9552) is corrupt

2. 选中空文件,删除 rm filepath


luyi@ubuntu:~/projects/example$ rm .git/objects/3a/60046cdd45cf3e943d1294b3cb251a63fb9552
rm: remove write-protected regular empty file ‘.git/objects/3a/60046cdd45cf3e943d1294b3cb251a63fb9552’? y

3.再次运行 git fsck --full 一般会检查到另外一个新的空文件,再删之。一劳永逸的办法就是在.git目录下find . -type f -empty -delete -print 会删除全部空文件


luyi@ubuntu:~/projects/example/.git$ find . -type f -empty -delete -print
./objects/c6/492f7ad72197e2fb247dcb7d9215035acdca7f
./objects/9f/fe81f4bb7367c00539a9a0d366ff2a7558bfed
./objects/7c/b9a39246389a8417006b9365f6136823034110
./objects/de/1092e8c90cb025e99501a4be0035753b259572
./objects/6f/a8c9109f2e0d29095490ca8f4eaf024a6e2dcb

4.至此,所有空文件删除完毕,再运行 git fsck --full,还是有错,head指向元素不存在,是之前一个空文件,我们已经删了。肿么办呢?


luyi@ubuntu:~/projects/example/.git$ git fsck --full
Checking object directories: 100% (256/256), done.
Checking objects: 100% (103719/103719), done.
error: HEAD: invalid sha1 pointer c6492f7ad72197e2fb247dcb7d9215035acdca7f
error: refs/heads/ia does not point to a valid object!
dangling blob 2a12b47881cd879987df8e50c9d900847c025bf4
dangling blob 5d4a7c616f0e59dd82608979e85d56f7a6785884
dangling blob cd6facde8c37f8389c12f3742185174a0536197b
dangling blob c2d0c0fba535d89cca9633d1b0ab780c8199dfd9
dangling blob 5117513970702f484278fd87732135a39588a073
dangling blob ac45f1874a0e42a6b9586594179f9825f3a40fd0
dangling blob c3355ad882b378740822e673d304e2cc091f1412
dangling blob 4d64dedf9f3518f25f7b7e3b1ad0dd6b477e0ce3
dangling blob 2487eae5cc4bfc23bc896c4051cb8f5522664e33
dangling blob 2a1907848af8aea53cb84e392225a5b6c4a81a5b
dangling blob 114233d9981a7933eacbff45a2b106ef1b61cfa9
dangling blob 9879ef3dd84a5515719fa7f35f982ac4d6a34e37
dangling blob f5b3bfd49e04c18ad12d590450a306a109b9151c
dangling blob 5fdb9f048aead1c85474fbca29b2ee327c821680

5.手动获得最后两条reflog ,运行tail -n 2 .git/logs/refs/heads/ia


luyi@ubuntu:~/projects/example$ tail -n 2 .git/logs/refs/heads/ia
3a0ecb6511eb0815eb49a0939073ee8ac8674f8a 99cb711e331e1a2f9b0d2b1d27b3cdff8bbe0ba5 卢祎 <luy@jjmmw.com> 1477039998 +0800    commit: nested into app

6.head当前是指向最新的那一条记录,所以我们看一下parent commit 即倒数第二条提交 git show 99cb711e331e1a2f9b0d2b1d27b3cdff8bbe0ba5


luyi@ubuntu:~/projects/example$ git show 99cb711e331e1a2f9b0d2b1d27b3cdff8bbe0ba5commit 99cb711e331e1a2f9b0d2b1d27b3cdff8bbe0ba5
Date:   Fri Oct 21 16:53:18 2016 +0800

    nested into app

diff --git a/pzbm/templates/pzbm/base.html b/pzbm/templates/pzbm/base.html
index 70331c5..c96d12c 100644
--- a/pzbm/templates/pzbm/base.html
+++ b/pzbm/templates/pzbm/base.html
@@ -6,7 +6,7 @@

我们可以看到内容,是好着的

7.那么我们就重新设置head,使其指向倒数第二条 git update-ref HEAD 99cb711e331e1a2f9b0d2b1d27b3cdff8bbe0ba5


luyi@ubuntu:~/projects/example$ git update-ref HEAD 99cb711e331e1a2f9b0d2b1d27b3cdff8bbe0ba5
luyi@ubuntu:~/projects/example$ git s
On branch ia
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   pzbm/templates/pzbm/invest_advisor/reports.html

8.最后提交以下新代码就OK了。这样保留下来我们的git log记录,只是修一下坏的节点而已。

git命令整理

博客来源:雨夜的博客

### Git 对象损坏问题分析 当遇到 `corrupt loose object` 错误时,通常表示某个 Git 对象文件已损坏或丢失。这种问题可能由多种原因引起,例如磁盘故障、意外中断或其他存储介质问题。以下是针对该问题的具体解决方案。 #### 1. 验证损坏的对象是否存在 可以尝试通过以下命令验证指定对象是否确实存在并确认其状态: ```bash git cat-file -t 8aec1be5e094127319bd28d6a43c078e1afa939f ``` 如果返回错误,则说明此对象已经损坏或不可访问[^1]。 #### 2. 尝试恢复损坏的对象 可以通过以下方法尝试恢复损坏的 Git 对象- **克隆远程仓库副本** 如果有可用的远程仓库,可以从远程重新获取缺失的对象: ```bash git fetch --all ``` - **从其他分支或提交中查找对象** 使用以下命令找到包含目标对象的提交记录,并尝试从中提取数据: ```bash git rev-list --objects --all | grep 8aec1be5e094127319bd28d6a43c078e1afa939f ``` 这可以帮助定位到具体涉及该对象的历史记录[^2]。 - **手动复制对象文件** 如果本地环境中还有备份或者团队成员拥有完整的 `.git/objects` 文件夹,可以直接将对应的对象文件(路径类似于 `.git/objects/8a/ec1be5e094127319bd28d6a43c078e1afa939f`)复制回当前项目目录下[^3]。 #### 3. 替代方案——重写历史忽略损坏部分 如果无法找回原始对象,可以选择丢弃受影响的部分来继续工作。注意这可能会导致某些更改永久丢失: ```bash git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch PATH_TO_FILE' --prune-empty --tag-name-filter cat -- --all ``` 其中需替换 `PATH_TO_FILE` 参数为目标文件路径[^4]。 --- ### 总结 上述方法提供了不同场景下的应对策略,优先推荐利用现有资源(如远程库或同事的工作区)重建缺少的数据;只有在无可挽回的情况下才考虑修改版本控制历史以绕过问题。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨夜的博客

大赏给个咖啡钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值