562

変更をコミットしようとすると、次のエラーが発生します。

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

私が持っている試しgit fsckてみました:

error: object file .git/objects/03/dfd60a4809a3ba7023cbf098eb322d08630b71 is empty
fatal: loose object 03dfd60a4809a3ba7023cbf098eb322d08630b71 (stored in .git/objects/03/dfd60a4809a3ba7023cbf098eb322d08630b71) is corrupt

このエラーを解決するにはどうすればよいですか?

4

27 に答える 27

1089

同様の問題がありました。Git 操作中にラップトップのバッテリーが切れました。ブー。

バックアップはありませんでした。(NB Ubuntu One は Git のバックアップ ソリューションではありません。正常なリポジトリを破損したリポジトリで上書きしてくれます。)

Git ウィザードの方へ、これが悪い修正方法である場合は、コメントを残してください。しかし、それは私にとってはうまくいきました...少なくとも一時的には。

ステップ 1: フォルダー.gitのバックアップを作成します(実際には、何かを変更するすべてのステップの間にこれを行いますが、新しいコピー先の名前、たとえば.git-old-1.git-old-2などを使用します) .):

cd ~/workspace/mcmc-chapter
cp -a .git .git-old

ステップ 2: 実行するgit fsck --full

git fsck --full

error: object file .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e is empty
fatal: loose object 8b61d0135d3195966b443f6c73fb68466264c68e (stored in .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e) is corrupt

ステップ 3: 空のファイルを削除します。私は一体何を考え出した。とにかく空白です。

rm .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e

rm: remove write-protected regular empty file `.git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e'? y

ステップ 3:git fsckもう一度実行します。空のファイルの削除を続行します。ディレクトリに移動して実行cdし、すべての空のファイルを削除することもできます。最終的に、Git は、実際にはオブジェクト ディレクトリで何かを行っていると言い始めました。.gitfind . -type f -empty -delete -print

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

ステップ 4: 空のファイルをすべて削除した後、最終的にgit fsck実際に実行するようになりました。

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

ステップ 5: 試してみgit reflogます。HEAD が壊れているため失敗します。

git reflog

fatal: bad object HEAD

ステップ 6: グーグル。これを見つけます。reflog の最後の 2 行を手動で取得します。

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

ステップ 7: ステップ 6 から、HEAD が現在最後のコミットを指していることがわかったことに注意してください。それでは、親コミットを見てみましょう。

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

出来た!

ステップ 8: では、HEAD を 9f0abf890b113a287e10d56b66dbab66adc1662d に向ける必要があります。

git update-ref HEAD 9f0abf890b113a287e10d56b66dbab66adc1662d

文句を言わなかった。

ステップ 9: fsck の内容を確認します。

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

ステップ 10: cache-tree の無効な sha1 ポインターは、(現在は古い) インデックス ファイル ( source ) からのもののように見えました。だから私はそれを殺し、リポジトリをリセットしました。

rm .git/index
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

ステップ 11: fsck をもう一度見ると...

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

ぶら下がっているブロブはエラーではありません。私は master.u1conflict には関心がありません。動作しているので、もう触れたくありません。

ステップ 12: ローカル編集に追いつく:

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")


git commit -a -m "recovering from the git fiasco"

[master 7922876] recovering from the git fiasco
 3 files changed, 12 insertions(+), 94 deletions(-)

git add tex/sept2012_code/example-code-testing.R
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
于 2012-09-11T13:53:19.677 に答える
351

Git オブジェクト ファイルが破損しています (他の回答でも指摘されているように)。これは、マシンのクラッシュなどの際に発生する可能性があります。

私も同じことがありました。ここで他の上位の回答を読んだ後、次のコマンドを使用して壊れた Git リポジトリを修正する最も簡単な方法を見つけました (.gitフォルダーを含む Git 作業ディレクトリで実行します)。

(最初に Git リポジトリ フォルダーを必ずバックアップしてください。)

find .git/objects/ -type f -empty | xargs rm
git fetch -p
git fsck --full

これにより、最初にリポジトリ全体の破損の原因となる空のオブジェクト ファイルが削除され、次にリモート リポジトリから欠落しているオブジェクト (および最新の変更) が取得され、完全なオブジェクト ストア チェックが実行されます。この時点で、これはエラーなしで成功するはずです (ただし、まだいくつかの警告があるかもしれません!)

PS。この回答は、Git リポジトリのリモート コピーがどこかに (GitHub などに) あり、壊れたリポジトリは、リモート リポジトリに関連付けられたローカル リポジトリであり、そのまま残っていることを示しています。そうでない場合は、私が推奨する方法で修正しようとしないでください。

于 2015-06-29T07:35:57.323 に答える
46

このエラーは、コミットをプッシュしているときにコンピューターがハングしたときに発生します。

これが私がそれを修正した方法です。


修正手順

git status

空/破損したオブジェクト ファイルを表示する

rm .git/objects/08/3834cb34d155e67a8930604d57d3d302d7ec12

それを除く

git status

fatal: bad object HEADメッセージが届きました

rm .git/index

indexリセットのため外します。

git reset

致命的: オブジェクト 'HEAD' を解析できませんでした。

git status
git pull

何が起こっているのかを確認するだけです

tail -n 2 .git/logs/refs/heads/MY-CURRENT-BRANCH

tail -n 2ログ ブランチの最後の 2 行を出力して、最後の 2 つのコミット ハッシュを表示します。

git update-ref HEAD 7221fa02cb627470db163826da4265609aba47b2

私は最後を選ぶcommit hash

git status

ファイルを削除したため、すべてのファイルが削除済みとして表示され.git/indexます

git reset

リセットに進む

git status

修正を確認する

于 2015-05-05T02:34:40.557 に答える
37

これを解決して、検出されたさまざまな空のファイルを削除しgit fsck、単純な Git プルを実行しました。

ファイルシステムでさえジャーナリングやその他の「トランザクション」技術を実装してファイルシステムを正常に保つようになった今、Git は電源障害や空き容量のために破損した状態になる (そしてそれ自体では回復できない) ことに失望しています。デバイス。

于 2013-05-07T14:10:18.610 に答える
8

VMを定期的に再起動する必要があるため、この問題が頻繁に発生します。何度か繰り返した後、Nathan Vanhoudnos が説明したプロセスを毎回繰り返すことはできないことに気付きました。ただし、常に機能します。次に、次のより高速なソリューションを見つけました。

ステップ1

リポジトリ全体を別のフォルダーに移動します。

mv current_repository temp_repository

ステップ2

オリジンからリポジトリを再度クローンします。

git clone source_to_current_repository.git

ステップ 3

新しいリポジトリの下にある.gitフォルダー以外のすべてを削除します。

ステップ 4

temp_repositoryから.gitフォルダーを除くすべてを新しいリポジトリに移動します。

ステップ 5

temp_repositoryを削除すれば完了です。

数回後、これらの手順を非常に迅速に実行できると確信しています。

于 2015-12-19T00:58:45.407 に答える
6
  1. app フォルダーを移動してバックアップを作成します。つまり、mv app_folder app_folder_bk ( git stashのようなものです)
  2. git clone your_repository
  3. 最後に、マージ ツールを開き ( Linux ではMeld diff ビューアーを使用し、Windows ではWinMergeを使用します)、右側 ( app_folder_bk ) から左側 (新しいapp_folder ) に変更をコピーします ( git stash applyのようなものです)。

それで全部です。最善の方法ではないかもしれませんが、とても実用的だと思います。

于 2014-02-20T15:15:31.953 に答える
4

1 つのスクリプトで

#! /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"
于 2021-01-30T21:11:42.457 に答える
3

私の場合、コミット メッセージを入力していて、ノートブックの電源がオフになっているために、このエラーが発生しました。

エラーを修正するために次の手順を実行しました。

  • git checkout -b backup-branch# バックアップ ブランチを作成する
  • git reset --hard HEAD~4# すべてがうまく機能するコミットにリセットします。私の場合、コミット メッセージを入力する前の時点まで、頭の中で 4 つのコミットを取り戻さなければなりませんでした。この手順を実行する前に、リセットするコミットのハッシュをコピーします。私の場合、最後の 4 つの commit のハッシュをコピーしました
  • git cherry-pick <commit-hash># 古いブランチから新しいブランチへのリセット コミット (私の場合は 4 つのコミットなので、この手順を 4 回実行しました) をチェリー ピックします。
  • git push origin backup-branch# 新しいブランチをプッシュして、すべてが正常に機能することを確認します
  • git branch -D your-branch# ブランチをローカルで削除します ('your-branch' は問題のあるブランチです)
  • git push origin :your-branch# リモートからブランチを削除
  • git branch -m backup-branch your-branch# バックアップ ブランチの名前を、問題があったブランチの名前に変更します
  • git push origin your-branch# 新しいブランチをプッシュ
  • git push origin :backup-branch# リモートからバックアップ ブランチを削除する
于 2014-04-27T18:37:53.657 に答える
0

クリーンなブランチから master をチェックアウトした後、同じ問題が発生しました。

しばらくすると、master で多くの変更されたファイルを認識しました。きれいなブランチから切り替えた後、なぜそこにいたのかわかりません。とにかく、変更されたファイルは私には意味がなかったので、それらを隠しただけでエラーはなくなりました。

git:(master) git stash

于 2014-07-01T14:40:29.057 に答える
0

Nathan VanHoudnos が説明した12 ステップの解決策も、私を窮地から抜け出すのに役立ちました。ありがとう。重要な手順は次のとおりです。

git fsck --full

すべての空のオブジェクトを削除します

rm .git/objects/...

次に、flog の 2 行を取得します。

tail -n 2 .git/logs/refs/heads/master

戻り値で

git update-ref HEAD ...

この時点でエラーはなくなったので、最新のファイルのバックアップを作成しました。次に、Git プルに続いて Git プッシュを実行します。バックアップを Git リポジトリ ファイルにコピーし、別の Git プッシュを実行しました。それは私を現在のものにしました。

于 2016-07-10T05:43:43.483 に答える
0

この状況では、この問題に従って問題を解決します。

  1. リポジトリ ディレクトリから .git フォルダを削除します。(安全のためにバックアップをとっておいてください)
  2. 私のレポを別のディレクトリにクローンします。
  3. 新しいクローン ディレクトリから .git フォルダをコピーします。
  4. 問題が発生した以前のディレクトリに貼り付けます。

git の状態を確認してください。うまくいけば、すべての変更を確認できます。これで、コミットしてプッシュできます。

于 2021-10-10T05:29:54.260 に答える