git gc fatalの処理方法:不正なオブジェクト参照/リモート/原点/ヘッドエラー?


131

Git ガベージコレクションを実行しようとしているときに、今日これをランダムにヒットしました。

$ git gc
fatal: bad object refs/remotes/origin/HEAD
error: failed to run repack

どうすればこれに対処できますか?

回答:


161

私はこれの影響を理解していませんが、このスレッドで提案さているように、これに遭遇したとき私はちょうどしました

$ mv .git/refs/remotes/origin/HEAD /tmp

(念のために保管しておいてください)

$ git gc

文句なしに働いた; 私は何の問題にも遭遇していません。


6
それは私にとってはうまくいき、私はデフォルトのブランチをmasterと呼ばれる別のブランチに変更したため、この問題に陥ったと思いますdevelop。私は後ろからそれを変更する前の日developmaster私は古いデフォルトのブランチを削除したdevelopが、私の作業ディレクトリに、ファイルが.git/refs/remotes/origin/HEADまだ指していなかったrefs/remotes/origin/developもう存在しています。この状況では、ファイルの削除は機能しました。
Stavarengo 2017

4
git prune私のために働いた、Gitに蓄積されたが有用なものによって参照されていないデータを削除する方法。
Sven Malvik

それらを実行すると、私の問題を解決:$ mv .git/refs/remotes/origin/HEAD /tmp $ git gc git prune
デビッドRauca

2
最善の方法は@WilQuの答えだと思います(stackoverflow.com/a/49944297/660339)。誰でもこれを確認できますか?
Ivan Perez

.gitフォルダーからこれらのファイルを削除するとgit gc、私にとってはうまくいきました
Vino

68

私が遭遇した問題(これは、@ Stavarengoが上記のコメントで言及したのと同じ問題です)は、デフォルトのリモートブランチ(develop私の場合)が削除されていましたが、それでもで参照されていました.git/refs/remotes/origin/HEAD

.git/refs/remotes/origin/HEAD私のエディターで開くとこれが示されました:

ref: refs/remotes/origin/develop

私は新しいデフォルトのブランチを指すように注意深く編集しましたが、すべて順調でした。

ref: refs/remotes/origin/master

私に気付いた手がかりは、実行中にgit pruneこのエラーが表示されたことです:

> git prune
warning: symbolic ref is dangling: refs/remotes/origin/HEAD

1
それも私の修正でした
Dan Carlstedt

1
これは私の正確な解決策でした。私たちのチームは最近、デフォルトのブランチ開発の使用からマスターにも変更しました
jmancherje

40

トレントンの答えを見た後、私は自分.git/refs/remotes/origin/HEADを見て、それが現在削除されている古いブランチも指していることを確認しました。

しかし、自分でファイルを編集する代わりに、ライアンの解決策を試しました。

git remote set-head origin --auto

ファイルは自動的に新しいブランチに設定され、git gcその後は問題なく動作しました。


うん、これは私にとってはうまくいきます-私がまったく同じシナリオにいたので。git remote set-head $REMOTE --auto私の場合、複数のリモートが設定されているため、$ REMOTEはリモートエイリアスであり、デフォルトの "origin"ではありません。
-Devy

29

これは機能しているように見えたため、解決策は次のとおりだと思いましたが、実際には問題を解決しないことがわかりました。

git remote set-head origin --auto

1
このコマンドが私に同じ問題を取り除くのを助けたようです。ただし、このコマンドの後でgit prune(最初のコマンド出力で推奨されていたように)も使用したため、最初、2番目、または両方で何が役に立ったかを正確に知ることができません。
Borys Pylhun 2017年

1
git remote set-head origin --auto使用せずにrefs / remotes / origin / HEADファイルを修正git prune
danio

私はこのエラーに遭遇しました:エラーを解消error: Multiple remote HEAD branches. Please choose one explicitlyするためにgit remote set-head origin mybranch( 'mybranch'ブランチがチェックアウトされている間に)使用する必要がありました。
derekmx271 '19年

3
完全な回答ではなく、誤解を招く可能性があるため、反対投票。
クリスチャンビエルマ2017年

9

シンボリック参照が壊れている可能性があります...次のようにデフォルトのブランチに置き換えてみてください:たとえば、デフォルトのブランチはマスターです

$ git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/master
$ git fetch --prune
$ git gc

それで解決するはずです。


0

git worktreesを使用している場合は、

git worktree prune

走る前に

git gc

私はワークツリーを破損させましたが、これは破損したワークツリーを削除した後でうまくいくようです。git pruneそれ自体は機能していないようです。


0

私のこの原因は、Windowsの圧縮フォルダーで作業していたことです。フォルダーを圧縮解除すると、パックファイルが破損し、存在しないブランチをプルーニングできないなど、他の奇妙な問題が連鎖的に発生しました。

唯一の修正は、作業ディレクトリを一掃して、リモートのrepoを再度クローンすることでした。幸いなことに、更新をプッシュおよびプルして、何も失われないようにすることができました。今はすべて順調です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.