Repositori Git rusak setelah komputer mati

95

Komputer saya mati dan sekarang salah satu repositori git saya rusak. Ketika saya mencoba untuk membayar master, saya diberitahu:

warning: ignoring broken ref refs/heads/master.
error: Your local changes to the following files would be overwritten by checkout:
        com.vainolo.jdraw2d.releng.p2/pom.xml
Please, commit your changes or stash them before you can switch branches.
Aborting

Ketika saya mengeksekusi git stashsaya mendapatkan:

fatal: bad revision 'HEAD'
fatal: bad revision 'HEAD'
fatal: Needed a single revision
You do not have the initial commit yet

Jadi apa yang bisa kulakukan?

Perbarui Output dari git reflog:

fatal: bad default revision 'HEAD'

Tidak terlalu menjanjikan ... Hasil dari git fsck:

error: Invalid HEAD
Checking object directories: 100% (256/256), done.
error: unable to unpack 59551f96b4e87a1c14293c19eb548ce6fa1f196f header
error: inflateEnd: stream consistency error (no message)
fatal: loose object 59551f96b4e87a1c14293c19eb548ce6fa1f196f (stored in .git/objects/59/551f96b4e87a1c14293c19eb548ce6fa1f196f) is corrupt
vainolo
sumber
Dapatkah Anda memeriksa apakah .git/refs/heads/masterada dan apakah isinya adalah hash komit yang valid dari repositori Anda (Anda dapat memeriksanya, misalnya menggunakan git show <hash>)?
aduk
Saya tahu ini jelas, tetapi masih bertanya - apakah Anda memiliki repo jarak jauh dari repo git yang sama?
Tuxdude
@poke isi .git/refs/heads/master/adalah sekelompok^@
vainolo
@Tuxdude ya, tetapi tidak diperbarui ke perubahan terbaru saya
vainolo
1
Apa yang git reflogmemberitahumu? Sudahkah kamu mencoba lari git fsck?
kynan

Jawaban:

175

Saya berhasil pulih melalui:

rm .git/refs/remotes/origin/HEAD
git fetch --all
jfrumar.dll
sumber
Dalam kasus saya itu terjadi karena saya menghapus beberapa cabang lokal dan jarak jauh (entah bagaimana file .git / refs / remote / origin / HEAD tetap dalam keadaan tidak konsisten). Mengubah konten file yang disebutkan di atas untuk menunjuk ke cabang lokal yang ada (misalnya ref: refs / remote / origin / master) memecahkan masalah ini. Namun, pendekatan di atas mungkin lebih baik karena HEAD mungkin menunjuk ke komit yang tidak ada di cabang saat ini.
crissdev
Jika masalah terjadi pada submodul git tertentu, perintah pertama sedikit berubah menjadirm <root repository path>/.git/modules/<path to the submodule>/refs/remotes/origin/HEAD
Gobe
1
Saya harus melakukannya rm -rf .git/refs/remotes/origin, tetapi Anda mengarahkan saya ke arah yang benar
Jacka
24

Mulailah dengan mengikuti langkah-langkah yang disarankan dalam Memulihkan repositori git yang rusak :

  • periksa apakah .git/refsmasih mengandung sesuatu yang bermanfaat
  • periksa git reflogdan gagal bahwa konten dari .git/logs/refs/heads/masteratau cabang apa pun tempat Anda berada terakhir
  • dijalankan git fsck, berpotensi dengan --unreachableatau--lost-found

Ini diharapkan akan memungkinkan Anda untuk mencari tahu apa yang masterharus menjadi referensi sehingga Anda dapat memulihkannya (yaitu memasukkan SHA1 yang benar ke dalam .git/refs/heads/master).

Jika objek apa pun yang terkandung dalam komit itu benar-benar rusak, HEADsayangnya Anda tidak dapat memulihkan komit Anda . Dengan asumsi pohon kerja dan / atau indeks Anda utuh, Anda dapat mencoba a git reset --soft(atau gagal yang a git reset) ke komit sebelumnya dan kemudian melakukan ulang komit. Hindari operasi apa pun yang mengubah pohon kerja Anda sa git checkout -fatau git reset --hard.

kynan
sumber
Saya melihat .git/logs/refs/heads/mybranch. Ini menunjukkan beberapa jenis sejarah komitmen untuk cabang ini. Menggali itu saya memilih SHA dan mencoba menampilkannya dengan git show. (Setiap komit memiliki dua SHA, saya memilih yang kedua, tepat sebelum nama penulis.) Yang terakhir rusak tetapi yang sebelumnya bisa git shown dan saya bisa mendorongnya dengan git push origin abcdef:mybranch.
Ed Avis
13

Saya mengalami masalah serupa setelah layar biru kematian di windows 8.1

Saya punya file di lokasi ini ...

C:\www\<project>\.git\refs\remotes\origin\<problem-branch>

Dan itu kosong sedangkan file cabang lain di folder ini memiliki string panjang di dalamnya.

NB Saya tidak memiliki perubahan / komitmen apa pun

  • Saya mencadangkan <problem-branch>file
  • Menghapus file
  • git fetch --all untuk mendapatkan cabang itu lagi

Kemudian tab penyelesaian otomatis mulai bekerja kembali

Carlton
sumber
6

Jika tidak ada banyak file yang dimodifikasi, menurut saya cara yang tepat untuk mengatasi masalah ini adalah:

  1. backup file yang Anda modifikasi di repo
  2. hapus repo Anda yang ada
  3. klon ulang dari server
  4. tempel file dari langkah 1 ke repo, dan git commit -a
alsotang
sumber
ya, tidak ada yang bisa memikirkan kloning ulang. saran bagus
Selman Genç
5

saya berhasil menyelesaikan ini dengan menghapus file master di direktori git \ refs \ heads

Manos Gaitanakis
sumber
Ini membantu, menghapus cabang dari daftar saya di intellij dan saya memeriksanya sebagai cabang baru. Untungnya saya telah mendorong perubahan saya sehingga semuanya ada di sana.
OAM
4

Setelah pembekuan dihitung dan kecelakaan, cabang git saya rusak dengan pesan: git fatal: your current branch appears to be broken. Saya tidak bisa berbuat apa-apa.

Setelah melakukan git fsckdisebutkan bahwa cabang tersebut memiliki error: Invalid HEAD. refs/heads/<branch>punya invalid sha1 pointer.

Setelah mengikuti opsi di sini, saya membuka .git/refs/heads/<branch>di editor notepad ++, dan masing-masing karakter sha1 adalah NUL.

Untungnya saya hanya perlu mengatur ulang cabang ke status jarak jauh, dan itu ada di repo bitbucket. Saya mengambil sha1 dari ujung remote repo dan menyalinnya ke .git/refs/heads/<branch>simpan, lalu melakukan a git reset --hard HEAD, dan semuanya kembali normal.

j4v1
sumber
2

Saya cukup bodoh untuk lupa mendorong dan komputer saya macet saat melakukan komit. Saya bisa memulihkan semuanya kecuali komit terakhir dengan membuka .git / logs / refs / heads /

File ini berisi semua komit (dengan SHA mereka) ke cabang, yang saya lakukan untuk memulihkan adalah:

  • Cadangkan perubahan terbaru ke folder temp
  • pindah ke "batu tulis bersih"
    • git checkout master
    • git reset --hard
  • checkout komit kedua untuk terakhir di log
  • buat cabang dari kepala yang terlepas ini
  • DORONG
  • Pulihkan perubahan terbaru
  • Berkomitmen lagi

Jadi, meskipun Anda membuat kesalahan bodoh, Anda tidak akan langsung ditarik kembali oleh kerja seharian dengan git :)

Markus Palcer
sumber
2

Saya tidak dapat melakukan checkout pada cabang master saya karena kesalahan ref tidak dapat mengunci. Saya akhirnya menghapus: .git/refs/remotes/origin/HEAD .git/refs/remotes/origin/master

dan memanggil perintah git ini:

git fetch --all
Keon Sadatian
sumber
1

Saya tahu ini adalah respons yang terlambat, tetapi saya mendapatkan kesalahan ini karena saya tidak memiliki origin/head. Anda dapat mengetahuinya dengan menjalankan git branch -r. Jika Anda tidak melihat Anda origin/headmenunjuk ke asal jauh, Anda dapat mengatur ini dengan menjalankan git remote set-head origin {{your branch name}}.

Sekarang jalankan git branch -rlagi, dan Anda akan melihat sesuatu seperti ini: origin/HEAD -> origin/develop

Saya harap ini membantu orang lain yang mengalami masalah ini.

aaronwbrown
sumber
1

Komputer saya macet dua kali dan akibatnya, repositori git saya rusak secara lokal. Saya tidak dapat menarik perubahan saya, ia meminta untuk menyetel asal jarak jauh tetapi tidak berhasil di gitKraken.

Pada prompt perintah saya, saya mendapatkan kesalahan ini masukkan deskripsi gambar di sini

Saya tahu bahwa referensi saya rusak dan perlu diperbaiki. Apa yang harus saya lakukan adalah, ke git bash (Di SourceTree klik "terminal"). Kemudian arahkan ke folder referensi seperti ini

cd .git
cd refs
cd remotes
cd origin

akan ada nama file masterdisana, gunakan lsuntuk melihat apa yang ada di direktorinya. Kemudian hapus saja menggunakan rm master

bam, file yang rusak hilang. Sekarang jika Anda mengeluarkan perintah git branch -a, itu akan menampilkan ini

$ git branch -a
* master
  remotes/origin/master (this in red color -scary :) )

Kemudian keluarkan perintah ini, dan itu akan memperbaiki referensi Anda

$ git remote set-head origin master

Singkatnya, jika Anda akan mencoba menarik remote, itu akan menampilkan nama remote kosong yang telah diperbaiki.

masukkan deskripsi gambar di sini

Hammad Khan
sumber
0

Saya memiliki masalah yang sama tetapi tidak berhasil, tidak dapat menemukan masalahnya. Saya mengambil repo saya ke samping, mengkloning ulang yang dari server dan mencoba menggabungkannya. Tentu saja itu menunjukkan banyak file yang tidak terkait dengan cabang saya, tetapi membantu mengisolasi file yang diperlukan.

Samuelens
sumber
0

Periksa apakah MSWindows membuat file desktop.ini yang mengandung git? itu untuk saya. Setelah saya menghapus semuanya di subfolder dari direktori .git, maka itu berfungsi.

vinnief
sumber
0

Saya mengalami masalah yang sama ketika Android Studio dihentikan tiba-tiba (karena kehilangan daya ke komputer).

Saya menyelesaikannya dengan menyalin konten C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\refs\heads\masterfile saya ke fileC:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\refs\remotes\origin\master file .

(Sebelumnya, saya juga mengaktifkan opsi 'Paksa Dorong' di Android Studio, tetapi menurut saya ini bukan langkah yang perlu.)

catatan:

Saya menemukan solusi ini dengan membandingkan konten file di C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\direktori saya (termasuk subdirektori) dengan file yang sesuai di proyek lain yang sehat - misalnya,C:\Users\myusername\AndroidStudioProjects\MyHealthyApp\.git\ . .

Anda mungkin memiliki file lain yang rusak, tetapi dengan membandingkan dengan proyek lain yang sehat, Anda dapat dengan cepat menemukan apa yang salah.

Jika Anda tidak memiliki proyek lain yang sehat dengan konfigurasi git, mungkin ada baiknya membuat yang sederhana dengan cara yang sama seperti Anda membuat proyek yang rusak sehingga dapat menyelidiki, membandingkan dan memperbaiki, dll.

PS - Pesan kesalahan saya (diedit) adalah: warning: ignoring broken refs/remotes/origin/master.fatal bad revision 'refs/remotes/origin/master..refs/heads/master' during executing git -c core.quotepath=false log refs/remotes/origin/master..refs/heads/master --pretty=format --encoding=UTF-8 -M --name-status -c --

larangan-geoengineering
sumber
0

Maafkan saya jika saya mengulangi setelah seseorang (saya belum membaca semua tanggapan). Menurut pendapat saya, cara termudah untuk mengatasi masalah ini adalah dengan menyalin proyek tanpa .git dan .idea, membersihkannya, mengkloning dari git, menghapus semuanya kecuali direktori di atas, lalu menempelkan salinan sebelumnya ke repo yang baru dibuat dengan .git dan .idea . Semoga masuk akal.

Andrey Sulay
sumber