Git error: object file is emptyの対処法

Mon Sep 10, 2018 - git
Sat Jan 18, 2020

git pullしたら以下のようなエラーがでました。恐らく、仮想環境で作業中に強制的にシャットダウンしたことが原因だと思う。

1
2
$ git pull
error: object file .git/objects/a8/91cc99653125f51ae5808661b3c4857ecae4d9 is empty

ググったら同じような状況に陥った人たちが、いたのでそれを参考に解決します。

how to fix GIT error: object file is empty?

エラーがでたディレクトリはboku。bokuの.gitをコピーして保存。

1
$ cp -a .git .git-old

次にgit fsckを実行します。git fsckとは、リポジトリの正当性を実行するコマンドです。要はリポジトリが壊れてないか確かめることができる。

オプションの完全なチェックを実行するには--fullを追記します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
$ git fsck --full
error: object file .git/objects/1b/6c2b8e42bdd36d9e47db64f56a85de6fa08e8c is empty
error: unable to mmap .git/objects/1b/6c2b8e42bdd36d9e47db64f56a85de6fa08e8c: No such file or directory
error: 1b6c2b8e42bdd36d9e47db64f56a85de6fa08e8c: object corrupt or missing: .git/objects/1b/6c2b8e42bdd36d9e47db64f56a85de6fa08e8c
error: object file .git/objects/4b/ec3106065cbeadf20c41aa8b69c605cd6a2675 is empty
error: unable to mmap .git/objects/4b/ec3106065cbeadf20c41aa8b69c605cd6a2675: No such file or directory
error: 4bec3106065cbeadf20c41aa8b69c605cd6a2675: object corrupt or missing: .git/objects/4b/ec3106065cbeadf20c41aa8b69c605cd6a2675
error: object file .git/objects/91/5805b29b6bab1a0436048413830f68412e0f72 is empty
error: unable to mmap .git/objects/91/5805b29b6bab1a0436048413830f68412e0f72: No such file or directory
error: 915805b29b6bab1a0436048413830f68412e0f72: object corrupt or missing: .git/objects/91/5805b29b6bab1a0436048413830f68412e0f72
error: object file .git/objects/9e/f4a120cddf5154432bb1571a3e3a76e8c33f3a is empty
error: unable to mmap .git/objects/9e/f4a120cddf5154432bb1571a3e3a76e8c33f3a: No such file or directory
error: 9ef4a120cddf5154432bb1571a3e3a76e8c33f3a: object corrupt or missing: .git/objects/9e/f4a120cddf5154432bb1571a3e3a76e8c33f3a
error: object file .git/objects/a8/91cc99653125f51ae5808661b3c4857ecae4d9 is empty
error: unable to mmap .git/objects/a8/91cc99653125f51ae5808661b3c4857ecae4d9: No such file or directory
error: a891cc99653125f51ae5808661b3c4857ecae4d9: object corrupt or missing: .git/objects/a8/91cc99653125f51ae5808661b3c4857ecae4d9
Checking object directories: 100% (256/256), done.
error: object file .git/objects/a8/91cc99653125f51ae5808661b3c4857ecae4d9 is empty
error: object file .git/objects/a8/91cc99653125f51ae5808661b3c4857ecae4d9 is empty
fatal: loose object a891cc99653125f51ae5808661b3c4857ecae4d9 (stored in .git/objects/a8/91cc99653125f51ae5808661b3c4857ecae4d9) is corrupt

rmコマンドを使って、emptyのオブジェクトを削除します。試しに一番上の6c2b8e42bdd36d9e47db64f56a85de6fa08e8cを消します。

1
2
3
$ rm .git/objects/1b/6c2b8e42bdd36d9e47db64f56a85de6fa08e8c
rm: 書き込み保護されたファイル 通常の空ファイル '.git/objects/1b/6c2b8e42bdd36d9e47db64f56a85de6fa08e8c' を削除しますか?
と聞かれるので、yと答える。

削除できているか確認します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
$ git fsck --full
error: object file .git/objects/4b/ec3106065cbeadf20c41aa8b69c605cd6a2675 is empty
error: unable to mmap .git/objects/4b/ec3106065cbeadf20c41aa8b69c605cd6a2675: No such file or directory
error: 4bec3106065cbeadf20c41aa8b69c605cd6a2675: object corrupt or missing: .git/objects/4b/ec3106065cbeadf20c41aa8b69c605cd6a2675
error: object file .git/objects/91/5805b29b6bab1a0436048413830f68412e0f72 is empty
error: unable to mmap .git/objects/91/5805b29b6bab1a0436048413830f68412e0f72: No such file or directory
error: 915805b29b6bab1a0436048413830f68412e0f72: object corrupt or missing: .git/objects/91/5805b29b6bab1a0436048413830f68412e0f72
error: object file .git/objects/9e/f4a120cddf5154432bb1571a3e3a76e8c33f3a is empty
error: unable to mmap .git/objects/9e/f4a120cddf5154432bb1571a3e3a76e8c33f3a: No such file or directory
error: 9ef4a120cddf5154432bb1571a3e3a76e8c33f3a: object corrupt or missing: .git/objects/9e/f4a120cddf5154432bb1571a3e3a76e8c33f3a
error: object file .git/objects/a8/91cc99653125f51ae5808661b3c4857ecae4d9 is empty
error: unable to mmap .git/objects/a8/91cc99653125f51ae5808661b3c4857ecae4d9: No such file or directory
error: a891cc99653125f51ae5808661b3c4857ecae4d9: object corrupt or missing: .git/objects/a8/91cc99653125f51ae5808661b3c4857ecae4d9
Checking object directories: 100% (256/256), done.
error: object file .git/objects/a8/91cc99653125f51ae5808661b3c4857ecae4d9 is empty
error: object file .git/objects/a8/91cc99653125f51ae5808661b3c4857ecae4d9 is empty
fatal: loose object a891cc99653125f51ae5808661b3c4857ecae4d9 (stored in .git/objects/a8/91cc99653125f51ae5808661b3c4857ecae4d9) is corrupt

ちゃんと削除できてます。ただし、一個一個削除していると大変なので、find . -type f -empty -delete -printでまとめて削除します。

1
$ find . -type f -empty -delete -print

確認。とりあえず、emptyのエラーは消えました。

1
2
3
4
5
6
7
8
9
$ git fsck --full
Checking object directories: 100% (256/256), done.
error: HEAD: invalid sha1 pointer a891cc99653125f51ae5808661b3c4857ecae4d9
error: refs/heads/master: invalid sha1 pointer a891cc99653125f51ae5808661b3c4857ecae4d9
error: refs/remotes/origin/master: invalid sha1 pointer a891cc99653125f51ae5808661b3c4857ecae4d9
notice: No default references
missing blob 1b6c2b8e42bdd36d9e47db64f56a85de6fa08e8c
missing blob 4bec3106065cbeadf20c41aa8b69c605cd6a2675
missing blob 915805b29b6bab1a0436048413830f68412e0f72

HEADが壊れているので、git reflogを実行して履歴を確認します。

1
2
$ git reflog
fatal: bad object HEAD

HEADが壊れる直前のコミットを探します。tailコマンドは、ファイルの最終行から数行を表示するコマンドです。標準では10行を表示します。

1
2
3
$ tail -n 2 .git/logs/refs/heads/master
99a1a3c6810c3676ca68d8e8c8b877862f16d1fb 30624b143c564c14b700a30c7555a3f173a6c035
vagrant <vagrant@vagrant.vm> 1536051562 +0000	commit: create dockerfile

git showを実行して、コミットの詳細を確認。2行目の最初のハッシュ値が直前のコミットを指すものです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ git show 30624b143c564c14b700a30c7555a3f173a6c035
error: refs/heads/master does not point to a valid object!
error: refs/remotes/origin/master does not point to a valid object!
commit 30624b143c564c14b700a30c7555a3f173a6c035
Author: vagrant <vagrant@vagrant.vm>
Date:   Tue Sep 4 08:59:22 2018 +0000

    create dockerfile

diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..45d61e9
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,5 @@
+#利用するUbuntuのイメージ
+FROM ubuntu:14.04 
+
+# wgetとdpkgをインストール
+RUN apt-get update && apt-get install -y wget dpkg
diff --git a/boku_rspec.md b/boku_rspec.md
index a592589..ff89da6 100644
--- a/boku_rspec.md
+++ b/boku_rspec.md
@@ -16,6 +16,7 @@ Gemfile

:

HEADをこのコミットに置き換える。

1
$ git update-ref HEAD 30624b143c564c14b700a30c7555a3f173a6c035

git fsckで確認。

1
2
3
4
5
6
$ git fsck --full
Checking object directories: 100% (256/256), done.
error: refs/remotes/origin/master: invalid sha1 pointer a891cc99653125f51ae5808661b3c4857ecae4d9
missing blob 1b6c2b8e42bdd36d9e47db64f56a85de6fa08e8c
missing blob 4bec3106065cbeadf20c41aa8b69c605cd6a2675
missing blob 915805b29b6bab1a0436048413830f68412e0f72

削除したコミットに関するエラーがでたので、git add の後を削除する。

1
2
3
4
5
$ rm .git/index
$ git reset
Unstaged changes after reset:
M	boku_rspec.md
M	docker.md

確認。

1
2
3
4
$ git fsck --full
Checking object directories: 100% (256/256), done.
error: refs/remotes/origin/master: invalid sha1 pointer a891cc99653125f51ae5808661b3c4857ecae4d9
dangling blob 045d5dd428f1d36a5e3740b59409d58bae0d9816

git statusを実行。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
$ git status
On branch master
Your branch is based on 'origin/master', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

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:   boku_rspec.md
	modified:   docker.md

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	.git-old/
	rails_helper.rb
	tasks_controller_spec.rb

no changes added to commit (use "git add" and/or "git commit -a")

ここまできたらあとは、commitしてpushするだけ。

See Also