Bagaimana menangani git gc fatal: bad object refs / remote / origin / HEAD error?

131

Saya secara acak menekan ini hari ini ketika mencoba menjalankan pengumpulan sampah Git :

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

Bagaimana saya menangani ini?

Ryan
sumber

Jawaban:

163

Saya tidak mengerti konsekuensi dari ini, tetapi seperti yang disarankan di utas ini , ketika saya menemukan ini, saya baru saja melakukannya

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

(menyimpannya untuk berjaga-jaga) dan kemudian

$ git gc

bekerja tanpa mengeluh; Saya tidak mengalami masalah apa pun.

petrelharp.dll
sumber
6
Itu berhasil untuk saya dan saya pikir saya mendapat masalah ini karena saya mengubah cabang default dari yang masterlain yang disebut develop. Beberapa hari sebelum saya mengubahnya kembali dari developmenjadi masterdan saya menghapus cabang default lamadevelop , tetapi di direktori kerja saya, file .git/refs/remotes/origin/HEADitu masih mengarah ke refs/remotes/origin/developyang sudah tidak ada lagi. Dalam situasi ini, menghapus file berhasil.
Stavarengo
4
git pruneberhasil untuk saya, cara untuk menghapus data yang telah terkumpul di Git tetapi tidak direferensikan oleh sesuatu yang berguna.
Sven Malvik
Mengeksekusi mereka memecahkan masalah saya:$ mv .git/refs/remotes/origin/HEAD /tmp $ git gc git prune
David Rauca
2
Saya menduga cara terbaik adalah jawaban @ WilQu ( stackoverflow.com/a/49944297/660339 ). Adakah yang bisa mengkonfirmasi ini?
Ivan Perez
menghapus file tersebut dari folder .git, daripada git gcbekerja untuk saya
Vino
68

Masalah yang saya hadapi (yang merupakan masalah yang sama dengan yang disebutkan @Stavarengo dalam komentar di atas) adalah bahwa cabang jarak jauh default ( developdalam kasus saya) telah dihapus, tetapi masih direferensikan di .git/refs/remotes/origin/HEAD.

Pembukaan .git/refs/remotes/origin/HEADdi editor saya menunjukkan ini:

ref: refs/remotes/origin/develop

Saya dengan hati-hati mengeditnya untuk menunjuk ke cabang default baru saya dan semuanya baik-baik saja:

ref: refs/remotes/origin/master

Petunjuk yang memberi tahu saya adalah bahwa berlari git prunemenunjukkan kesalahan ini:

> git prune
warning: symbolic ref is dangling: refs/remotes/origin/HEAD
Trenton
sumber
1
Itu adalah perbaikan saya juga
Dan Carlstedt
1
Ini adalah solusi tepat saya. Tim kami baru-baru ini berubah dari menggunakan pengembangan cabang default menjadi master juga
jmancherje
40

Setelah melihat jawaban Trenton, saya melihat jawaban saya .git/refs/remotes/origin/HEADdan melihat bahwa itu juga menunjuk ke cabang lama yang sekarang sudah dihapus.

Tetapi alih-alih mengedit file sendiri, saya mencoba solusi Ryan:

git remote set-head origin --auto

Ini secara otomatis mengatur file ke cabang baru, dan git gcberfungsi dengan baik setelah itu.

WilQu
sumber
Ya, ini berhasil untuk saya - karena saya berada dalam skenario yang persis sama. git remote set-head $REMOTE --autodalam kasus saya, $ REMOTE adalah alias jarak jauh, bukan "asal" default, karena saya memiliki beberapa pengaturan jarak jauh.
Devy
29

Saya pikir solusinya adalah sebagai berikut karena ini sepertinya berhasil, tetapi ternyata tidak benar-benar menyelesaikan masalah.

git remote set-head origin --auto
Ryan
sumber
1
Sepertinya perintah ini membantu saya menyingkirkan masalah yang sama. Namun, setelah perintah ini, saya juga menggunakan git prune(seperti yang direkomendasikan dalam keluaran perintah pertama), jadi saya tidak dapat mengetahui dengan tepat apa yang membantu saya - pertama, kedua, atau keduanya.
Borys Pylhun
1
git remote set-head origin --automemperbaiki file refs / remote / origin / HEAD saya tanpa harus saya gunakangit prune
danio
Saya mengalami kesalahan ini:, error: Multiple remote HEAD branches. Please choose one explicitlydan harus menggunakan git remote set-head origin mybranch(sementara cabang 'cabang saya' sedang melakukan pembayaran) untuk menghilangkan kesalahan.
derekmx271
3
Downvoting karena bukan jawaban lengkap dan bisa menyesatkan.
Christian Vielma
9

Sepertinya simbolik-ref Anda mungkin rusak ... Coba ganti dengan cabang default Anda seperti ini: Misalnya, cabang default saya adalah master

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

Itu harus memperbaikinya.

Conal Trinitrotoluene Da Costa
sumber
0

Jika Anda menggunakan git worktrees, pastikan Anda melakukan file

git worktree prune

sebelum berlari

git gc

Saya memiliki pohon kerja yang rusak dan ini sepertinya berhasil setelah menghapus pohon kerja yang rusak. git prunedengan sendirinya sepertinya tidak berhasil.

JeffP
sumber
0

Penyebabnya bagi saya adalah bekerja di folder terkompresi di Windows. Ketika folder tidak terkompresi, itu merusak file paket, masalah aneh lainnya, seperti tidak dapat memangkas cabang yang tidak ada.

Satu-satunya perbaikan adalah menghapus direktori kerja dan mengkloning remote repo lagi. Untungnya, saya masih bisa melakukan push dan pull update untuk memastikan tidak ada yang hilang. Semuanya baik-baik saja sekarang.

Will Strohl
sumber