How to deal with fatal: bad object HEAD in git

Shawn Wang

如何解决 Git 中的 fatal: bad object HEAD 错误

原文由 Shawn Wang 发布,订阅该博客

作为一个为了省钱而用 Apple iCloud(全世界最烂的同步服务)来同步我的Obsidian 第二大脑的人,我最近经常遇到这个问题:

$ git status
fatal: bad object HEAD
$ git log
fatal: bad object refs/heads/main

Stack Overflow 上得票最高的答案已经有 10 年历史了,让你直接 rm -rf .git,当然,这根本不是“正确”的做法。

这个问题我已经修过好几次,直到最近才和 ChatGPT 一起把它彻底搞明白。记录在这里,以备后用:

$ git fetch origin
# 这招对我通常就管用了——之后就可以正常提交、合并和推送了

# 希望这样就能让 git status 重新正常工作
$ git pull

当情况比平时更操蛋的时候

# confirm fuckedness

$ git fsck
bad sha1 file: .git/objects/00/084ad8182051c580009e8ccc22e224d97a4823 2
bad sha1 file: .git/objects/02/8027ce244a5390478159b510bd6767d648e31f 2
bad sha1 file: .git/objects/03/8c235cd6cc3e93596b25d7fb0ab14d9a999ec7 2
bad sha1 file: .git/objects/05/72e5490252d8fd25230669000747a7032a14df 2
bad sha1 file: .git/objects/07/ecafe1981e587022b562562ce02fd0adc45beb 2
bad sha1 file: .git/objects/09/e5b5f51f4f9683155f7a81d4fad1321e4085ee 2
bad sha1 file: .git/objects/0a/47019b78b8fd69a1b1a2d96b2be442fbceaf49 2
bad sha1 file: .git/objects/0c/b9400cec84abac87519225f7e5ceca987e7f66 2
bad sha1 file: .git/objects/10/2a21b02d2f08c777bfe0066de28afe0df3290c 2
bad sha1 file: .git/objects/14/e8edad8d4898bc04c4a00ce0df268cf359df63 2
bad sha1 file: .git/objects/14/65567afb6ee576ceb3e3061ffdf9c4ccd47095 2
bad sha1 file: .git/objects/1a/ac8cf84058d474b8845fe4ff410a2a1bc5a25a 2
bad sha1 file: .git/objects/1b/5cf76bb3a880fcf70083fda0aa4d0faccb5864 2

# etc etc etc

如果你看到很多“2”,那就是 iCloud 在搞鬼。用下面这条命令解决:

#  remove all files in .git with a space and then a number in their name, likely duplicates created by icloud
find .git -type f -name '* [0-9]*' -delete

然后你就可以再执行一次 git fetch origin 了。

如果你看到

$ git log
fatal: bad object refs/heads/main

那就运行:

git update-ref -d refs/heads/main

杂项备注

# NOTE: THIS WILL DESTROY ANY UNCOMMITTED/UNSAVED CHANGES - take care before running it
$ git reset --hard origin/main

这可能会显示一些损坏的对象:

remote: Enumerating objects: 3899, done.
remote: Counting objects: 100% (888/888), done.
remote: Compressing objects: 100% (364/364), done.
remote: Total 3899 (delta 554), reused 597 (delta 523), pack-reused 3011
Receiving objects: 100% (3899/3899), 1.32 MiB | 9.92 MiB/s, done.
error: corrupt loose object 'dc3711cb3ba71eefe40c8e49cc9c9fb311d29553'
fatal: loose object dc3711cb3ba71eefe40c8e49cc9c9fb311d29553 (stored in .git/objects/dc/3711cb3ba71eefe40c8e49cc9c9fb311d29553) is corrupt
fatal: fetch-pack: invalid index-pack output
fatal: Could not parse object 'origin/main'.

所以修复方法是:

rm -f .git/objects/dc/3711cb3ba71eefe40c8e49cc9c9fb311d29553
git fetch origin

(7 月 31 日更新)松散对象损坏

今天我也遇到了这个问题:

$ git fsck

error: corrupt loose object '25726bffc0e97532098679d0ed04095710452d29'
error: unable to unpack contents of .git/objects/25/726bffc0e97532098679d0ed04095710452d29
error: 25726bffc0e97532098679d0ed04095710452d29: object corrupt or missing: .git/objects/25/726bffc0e97532098679d0ed04095710452d29
error: corrupt loose object '5b4e2ac94c33715545674545e501a705ea20924b'
error: unable to unpack contents of .git/objects/5b/4e2ac94c33715545674545e501a705ea20924b
error: 5b4e2ac94c33715545674545e501a705ea20924b: object corrupt or missing: .git/objects/5b/4e2ac94c33715545674545e501a705ea20924b
error: corrupt loose object 'ad7ceee5b187af409cbd2219bc4b578faf425471'
error: unable to unpack contents of .git/objects/ad/7ceee5b187af409cbd2219bc4b578faf425471
error: ad7ceee5b187af409cbd2219bc4b578faf425471: object corrupt or missing: .git/objects/ad/7ceee5b187af409cbd2219bc4b578faf425471
error: corrupt loose object 'fdacf1b391398e4548fa3a9f09b0f6714881907c'
error: unable to unpack contents of .git/objects/fd/acf1b391398e4548fa3a9f09b0f6714881907c
error: fdacf1b391398e4548fa3a9f09b0f6714881907c: object corrupt or missing: .git/objects/fd/acf1b391398e4548fa3a9f09b0f6714881907c
Checking object directories: 100% (256/256), done.
Checking objects: 100% (27396/27396), done.
missing blob 60e0633917e44a958f890039cff7297f99d8e8eb
dangling commit d885e9e214a1f84ce5feb8fdcdf51a27249e689e
dangling commit a38bc134bc0ec9741e7abbfa8ee200a0c82253d6
missing blob fdacf1b391398e4548fa3a9f09b0f6714881907c
missing blob 5b4e2ac94c33715545674545e501a705ea20924b
missing blob 25726bffc0e97532098679d0ed04095710452d29
missing blob f2f68aa9deda03f256574d468395e840144d9d05
missing blob ad7ceee5b187af409cbd2219bc4b578faf425471

我收到了很多带各种花里胡哨参数的建议,但最终管用的还是这个办法:

git reset <last good remote commit> # NOT hard!
git stash # to store stuff that has been changed since last good remote commit
git fetch origin # pull down everything since last commit
git stash pop # put back the new stuff
git add . && git commit -m "add back new stuff" # new stuff
git push origin main # done!

本文章由 muse-spark-1.2-contributor 进行翻译

评论