fc2ブログ

Gitのエラーを直そう object is empty →refs/remotes/origin/master does not point to a valid object!

LMDE(クライアント)+CentOSサーバー(リポジトリ置いてあるサーバー)でgit管理してたらある日エラーでpushもpullもできなくなってしまいました。
たぶん作業してたLMDEのほうでXorgがハングしたっぽくて強制再起動書けたのが原因ではあるかと。そして多分CentOSサーバーに置いてあるmasterは大丈夫。

エラーはこんな感じ。

$ git fsck --full
Checking object directories: 100% (256/256), done.
error: object file .git/objects/54/b9b82b7a061d307f542f70867df49fe8f35004 is empty
error: object file .git/objects/54/b9b82b7a061d307f542f70867df49fe8f35004 is empty
fatal: loose object 54b9b82b7a061d307f542f70867df49fe8f35004 (stored in .git/objects/54/b9b82b7a061d307f542f70867df49fe8f35004) is corrupt



さて、ぐぐってみるとerror吐いてるobject内のファイルを削除すればいいとかいう記事がちらほら。単純に試してみたけどうまく行かず。
Stack Over Flowに詳細な手順が!!

how to fix GIT error: object file is empty?
というわけでここからobject file is emptyの修復。

1..gitのバックアップ

$ cp -a .git .git-old


現在の.gitディレクトリを.git-oldとしてコピーしてバックアップ。

2.git fsck --fullを走らせる

$ git fsck --full
Checking object directories: 100% (256/256), done.
error: object file .git/objects/54/b9b82b7a061d307f542f70867df49fe8f35004 is empty
error: object file .git/objects/54/b9b82b7a061d307f542f70867df49fe8f35004 is empty
fatal: loose object 54b9b82b7a061d307f542f70867df49fe8f35004 (stored in .git/objects/54/b9b82b7a061d307f542f70867df49fe8f35004) is corrupt



3.エラーが出てるファイルを削除する
$ rm .git/objects/54/b9b82b7a061d307f542f70867df49fe8f35004
rm: 書き込み保護されたファイル 通常の空ファイル `.git/objects/54/b9b82b7a061d307f542f70867df49fe8f35004' を削除しますか?y

4.エラーが消えるまで2と3を繰り返す
いやー、エラー吐いてるのって一個だけだと思ったら違うんですね。次々出てくるんで次々削除します。(ぶっちゃけかなりめんどい
よくよく読んだら.gitに入ってfind . -type f -empty -deleteで削除することもできるとかなんとか書いてありますが、もうやっちゃったあとで後の祭り。

$ git fsck --full
Checking object directories: 100% (256/256), done.
error: object file .git/objects/76/d3e0682bb2d8bdfd8b3a8872eea58e53eccbed is empty
error: object file .git/objects/76/d3e0682bb2d8bdfd8b3a8872eea58e53eccbed is empty
fatal: loose object 76d3e0682bb2d8bdfd8b3a8872eea58e53eccbed (stored in .git/objects/76/d3e0682bb2d8bdfd8b3a8872eea58e53eccbed) is corrupt


$ rm .git/objects/76/d3e0682bb2d8bdfd8b3a8872eea58e53eccbed
rm: 書き込み保護されたファイル 通常の空ファイル `.git/objects/76/d3e0682bb2d8bdfd8b3a8872eea58e53eccbed' を削除しますか?y


これを6-7回繰り返すとemptyエラーは消えました。

$ git fsck --full
Checking object directories: 100% (256/256), done.
Checking objects: 100% (250/250), done.
error: HEAD: invalid sha1 pointer a03514ed39862e69c265fbeea8b599151f7cf03f
error: refs/heads/master: invalid sha1 pointer a03514ed39862e69c265fbeea8b599151f7cf03f
error: refs/remotes/origin/master: invalid sha1 pointer a03514ed39862e69c265fbeea8b599151f7cf03f
notice: No default references
dangling blob 65c322ef3ba52eb0717bfc74e0ab4d4f3a668543


しかしまだエラーは出てますね。

5.HEADが壊れてるっぽいので git reflog を試すけどたぶんFAILするよ。

$ git reflog
fatal: bad object HEAD


git reflogはHEADの履歴を見れるコマンド、なはずだけどエラーですかねこれは。

6.$ tail -n 2 .git/logs/refs/heads/masterで最後の2つを見てみる
ちょっとスパムよけのためにアドレスの@マークだけ変えてるけどログはこんな。

$ tail -n 2 .git/logs/refs/heads/master
15482f922b224a56804e6c357722bc8e57f6ec6a 10404ed50d630b2dc687c5f20d566220791ed997 t-min <na8ctmあっとgmail.com> 1437371212 +0900 commit: fix contact
10404ed50d630b2dc687c5f20d566220791ed997 a03514ed39862e69c265fbeea8b599151f7cf03f t-min <na8ctmあっとgmail.com> 1437472949 +0900 commit: blog-comment-form fix


一応これはエラーでcommitできなくなる前の2つがちゃんと見えていますね。
ここで履歴が変だった時はまためんどくなりそうですが。

7.HEADをメモっといて最後のcommitのstatusを確認。
最初にならんでる英数の羅列ですね。上から順に時系列なので下の方、10404ed50d630b2dc687c5f20d566220791ed997がそれになります。

$ git show 10404ed50d630b2dc687c5f20d566220791ed997
commit 10404ed50d630b2dc687c5f20d566220791ed997
Author: t-min <na8ctmあっとgmail.com>
Date: Mon Jul 20 14:46:52 2015 +0900

fix contact

diff --git a/Elements/header.php b/Elements/header.php
index 3b75e84..067ec54 100755
--- a/Elements/header.php
+++ b/Elements/header.php
@@ -11,9 +11,9 @@
<header>
<div class="header-inner">
<div class="page-header">
- <h1>Example page header <small>Subtext for header</small></h1>
+ <?php $this->BcBaser->logo(array('class' => 'logo')) ?> <h1>Example page header <small>Subtext for header</small></h1>
</div>
- <?php $this->BcBaser->logo(array('class' => 'logo')) ?>
+



8. git update-ref HEADを使って上記のポイントにHEADを書き戻す
上記のように一番新しくて確認がとれるポイントのHEADに書き戻す?

$ git update-ref HEAD 10404ed50d630b2dc687c5f20d566220791ed997



9.もっかいfsck --fullしてみてみる。

$ git fsck --full
Checking object directories: 100% (256/256), done.
Checking objects: 100% (250/250), done.
error: refs/remotes/origin/master: invalid sha1 pointer a03514ed39862e69c265fbeea8b599151f7cf03f
dangling blob 49990d6e14503798f142dcb0d5b23cb0c8f80244
dangling blob 96ba64ee46d7f07803ff0e53e2330ee27b19e186
dangling blob 39bb2b053302e7072cd78041059652e59962bb67
dangling blob 485bb6cfeb1bd87879c675f69d2cb50e2bb285f4
dangling blob 65c322ef3ba52eb0717bfc74e0ab4d4f3a668543
dangling blob 6cdbbcee6a4553f136f85d023e16f876e97f55e3
dangling blob bb7796ed485e66822fe80dbf57d0c0c8e93cd963
dangling blob cf1f6bcf645c352d36bb7f37ba10a698dcd446bf



10.invalid sha1 pointer a03514ed39862e69c265fbeeってのはindex fileから来てるようなので、killしてresetする
./git/indexを削除してgit resetしてみます。

$ rm .git/index
$ git reset
Unstaged changes after reset:
M Elements/blog_comments.php
M Elements/sidenav.php
M Elements/widgets/search.php
M Pages/about.php
D Pages/about/index.php
M Pages/blog/index.php
D Pages/galally/index.php
D Pages/galally/templategarden-alpha.php
M Pages/index.php
M Pages/mobile/index.php
M Pages/news/index.php
M Pages/sample.php
D Pages/service.php
M Pages/service/index.php
M Pages/service/service1.php
M Pages/service/service2.php
M Pages/service/service3.php
M Pages/smartphone/about.php
M Pages/smartphone/icons.php
M Pages/smartphone/index.php
M Pages/smartphone/service.php
M Pages/smartphone/sitemap.php
M css/style.css



11.もっかいfsck --full
dangling blob はエラーじゃないとか言ってますが、まだ invalid sha1 pointerのエラーが出てますね。

$ git fsck --full
Checking object directories: 100% (256/256), done.
Checking objects: 100% (250/250), done.
error: refs/remotes/origin/master: invalid sha1 pointer a03514ed39862e69c265fbeea8b599151f7cf03f
dangling blob 49990d6e14503798f142dcb0d5b23cb0c8f80244
dangling blob 96ba64ee46d7f07803ff0e53e2330ee27b19e186
dangling blob 39bb2b053302e7072cd78041059652e59962bb67
dangling blob 485bb6cfeb1bd87879c675f69d2cb50e2bb285f4
dangling blob 65c322ef3ba52eb0717bfc74e0ab4d4f3a668543
dangling blob 6cdbbcee6a4553f136f85d023e16f876e97f55e3
dangling blob bb7796ed485e66822fe80dbf57d0c0c8e93cd963
dangling blob cf1f6bcf645c352d36bb7f37ba10a698dcd446bf


おっかしーなー。
試しにこのあと $ git status →$ git add . →$ git commit -m ""→$ git push origin masterやってみたけどエラーでした。

具体的にはこんな感じでpushができない。

$ git status
On branch master
Changes not staged for commit:
(use "git add/rm ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
(commit or discard the untracked or modified content in submodules)

modified: Elements/blog_comments.php
modified: Elements/sidenav.php
modified: Elements/widgets/search.php
modified: Pages/about.php
deleted: Pages/about/index.php
modified: Pages/blog/index.php
deleted: Pages/galally/index.php
deleted: Pages/galally/templategarden-alpha.php
modified: Pages/index.php
modified: Pages/mobile/index.php
modified: Pages/news/index.php
modified: Pages/sample.php
deleted: Pages/service.php
modified: Pages/service/index.php
modified: Pages/service/service1.php
modified: Pages/service/service2.php
modified: Pages/service/service3.php
modified: Pages/smartphone/about.php
modified: Pages/smartphone/icons.php
modified: Pages/smartphone/index.php
modified: Pages/smartphone/service.php
modified: Pages/smartphone/sitemap.php
modified: contest (modified content, untracked content)
modified: css/style.css

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

.git-old/
css/.#style.css
js/jquery-2.1.4.min.js

no changes added to commit (use "git add" and/or "git commit -a")
$ git add .
$ git commit -m "adjust sidenav"
[master cea8f1a] adjust sidenav
132 files changed, 590 insertions(+), 372 deletions(-)
create mode 100644 .git-old/COMMIT_EDITMSG
create mode 100644 .git-old/FETCH_HEAD
create mode 100644 .git-old/HEAD
create mode 100644 .git-old/ORIG_HEAD
create mode 100644 .git-old/config
create mode 100644 .git-old/description
create mode 100755 .git-old/hooks/applypatch-msg.sample
create mode 100755 .git-old/hooks/commit-msg.sample
create mode 100755 .git-old/hooks/post-update.sample
create mode 100755 .git-old/hooks/pre-applypatch.sample
create mode 100755 .git-old/hooks/pre-commit.sample
create mode 100755 .git-old/hooks/pre-push.sample
create mode 100755 .git-old/hooks/pre-rebase.sample
create mode 100755 .git-old/hooks/prepare-commit-msg.sample
create mode 100755 .git-old/hooks/update.sample
create mode 100644 .git-old/index
create mode 100644 .git-old/info/exclude
create mode 100644 .git-old/logs/HEAD
create mode 100644 .git-old/logs/refs/heads/master
create mode 100644 .git-old/logs/refs/remotes/origin/master
create mode 100644 .git-old/objects/06/7ec54b48387e93891b500d41ac35fc48f903d3
create mode 100644 .git-old/objects/0e/c399c90a745bb1927c211eea11c0e8baddaa1e
create mode 100644 .git-old/objects/10/404ed50d630b2dc687c5f20d566220791ed997
create mode 100644 .git-old/objects/12/6a740ea35584d07624790764c3de1634d818b4
create mode 100644 .git-old/objects/14/13fc609ab6f21774de0cb7e01360095584f65b
create mode 100644 .git-old/objects/15/482f922b224a56804e6c357722bc8e57f6ec6a
create mode 100644 .git-old/objects/1a/2b4a7015e4f8e5905fcd3d0ea92e716cafde4f
create mode 100644 .git-old/objects/1c/95e4f9a4992c8559b87573764c931f33c6793d
create mode 100644 .git-old/objects/1f/91b19bb366f92795ba9d26b3afae6e137b9702
create mode 100644 .git-old/objects/22/9aacc6c4bd8f9cba4fb1ac7284b4aa876a6aaa
create mode 100644 .git-old/objects/25/1c3763b2445341e5ea52adeaa8afc93f92402e
create mode 100644 .git-old/objects/2a/f55dbf345e3a67491becf400e3e4dc696b65e0
create mode 100644 .git-old/objects/31/80ee179d9f27d32ede5ccb1d36ec519fc833e8
create mode 100644 .git-old/objects/32/0e6b51f0f91c9dc5cb722b9035b4daf81e8b08
create mode 100644 .git-old/objects/35/1fa003174cc31ea9cd0aefe469707ff2052215
create mode 100644 .git-old/objects/36/c4aff4c574d6ec417d1b7ad676176dcf70be35
create mode 100644 .git-old/objects/37/8aad8b15cca4cdf24871c7175810cbc941e92e
create mode 100644 .git-old/objects/39/bb2b053302e7072cd78041059652e59962bb67
create mode 100644 .git-old/objects/3b/75e844ac18cfc1a17d3409e446f09e11203aa6
create mode 100644 .git-old/objects/3c/e6bf1deae4f510e219e024cb5695aa01564df5
create mode 100644 .git-old/objects/3f/d37df7fd387ca9a2715ad7b50638c2f7df4c8a
create mode 100644 .git-old/objects/48/2c7911ae61e5e0b27fe57e7489b8192f7e5e95
create mode 100644 .git-old/objects/48/591633b3e59a5c1593fc108e20d419c9ab80cc
create mode 100644 .git-old/objects/48/5bb6cfeb1bd87879c675f69d2cb50e2bb285f4
(中略)
mode change 100644 => 100755 Pages/smartphone/sitemap.php
create mode 120000 css/.#style.css
create mode 100644 js/jquery-2.1.4.min.js
$ git push origin master
error: refs/remotes/origin/master does not point to a valid object!
error: refs/remotes/origin/master does not point to a valid object!
tmin@192.168.0.2's password:
Connection closed by 192.168.0.2
fatal: Could not read from remote repository.



でもこれはpushができないだけでそれ以前はちゃんと動いているみたい。

というわけでここからerror: refs/remotes/origin/master does not point to a valid object!を直す作業。

これまたStack Over Flowから。
Git refs/remotes/origin/master does not point to a valid object
git gc なんちゃらで解決できるとかなんとか。
git gcってのはリポジトリ内の不要なオブジェクトを削除し、最適化を行うらしいです。
早速やってみましょう。
1.git gc

$ git gc
Counting objects: 521, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (422/422), done.
Writing objects: 100% (521/521), done.
Total 521 (delta 115), reused 235 (delta 53)
p>



2.git fsck --full

$ git fsck --full
Checking object directories: 100% (256/256), done.
Checking objects: 100% (521/521), done.
dangling blob 9caa2d1c3f1dcb8022ec31e204a5886b7567694d



3.git update-ref -d
後ろにはfsck --fullで出てた最後の行の英数列を。

$ git update-ref -d 9caa2d1c3f1dcb8022ec31e204a5886b7567694d



4.git gc --aggressive

$ git gc --aggressive
Counting objects: 521, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (475/475), done.
Writing objects: 100% (521/521), done.
Total 521 (delta 124), reused 397 (delta 0)



5.git remote update --prune

$ git remote update --prune
Fetching origin
tmin@192.168.0.2's password:


どうやら同期できたような感じ。
なのでここから普通にaddしてcommitしてみます

6.add→commit

$ git add .


$ git status
On branch master
All conflicts fixed but you are still merging.
(use "git commit" to conclude merge)

Changes to be committed:

modified: Elements/widgets/search.php

Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
(commit or discard the untracked or modified content in submodules)

modified: contest (modified content, untracked content)


$ git commit -m "adjust sidenav"
[master f0bd309] adjust sidenav


pushしてみます。

$ git push origin master
tmin@192.168.0.2's password:
Counting objects: 196, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (174/174), done.
Writing objects: 100% (196/196), 842.35 KiB | 0 bytes/s, done.
Total 196 (delta 18), reused 183 (delta 7)
To ssh://192.168.0.2/home/tmin/basertheme
a03514e..f0bd309 master -> master


できたー\(^o^)/

けっこう大変でしたが、一応手順通りにやってみたらさほど大きなトラブルはなくいけましたね。
やってみてからでなんですが、リポジトリふっとばす可能性も無きにしもあらずなので、サーバーに置いてあるリポジトリの方もバックアップ取ってからやったほうがよかったかも知れません。でかいプロジェクトだと致命傷ですからね。

関連記事
いまさら始めるGithHub & GistでFC2にソースコード貼り付け
WindowsでGitHubのリポジトリ管理(Windows10 TPでgit)
いまさらながらLinux上(LMDE)からGitHubを使ってみよう
関連記事
総合案内当ブログについて
Windowsの目次Linuxの目次Linuxの目次2・ ・自作PC関連の目次Web技術関連の目次
全記事一覧情報サイト新着RSS一覧

Sponsored Link

コメントの投稿

管理者にだけ表示を許可する
ブログ内検索

カスタム検索

フリーエリア

クリックで救える命がある。

レンタルサーバー

さくらのマネージドサーバ
さくらインターネットのVPS
ConoHaのVPS
WebARENA VPSクラウド
99円レンタルサーバー
【CloudCore VPS】
GMOクラウドのレンタルサーバー
転送量無制限 ABLENET
@WAPPYレンタルサーバー
SPPDレンタルサーバー

カテゴリー+月別アーカイブ

 

アクセスカウンター

現在の閲覧者数:

プロフィール

tmin

Author:tmin
PCヲタ。ライト2ちゃんねら。
スロット好きのギャンブラー。(元
むしろ人生がギャンブルだが目下のところ負けっぱなし。
座右の銘は「結果オーライ」。故に基本適当。
トラブルもまた楽しみのひとつ

コメント、トラバ、相互リンク歓迎。お気軽にどうぞ。
当ブログについて
Twitterでこっちとあっちの更新情報流すことにしてみます。
http://twitter.com/t_min
Project Mikunchu♪Wikiできました。
Mikunchu200x40.png