Saya mengalami kegagalan hard disk yang mengakibatkan beberapa file di repositori Git rusak. Saat menjalankan git fsck --full
saya mendapatkan output berikut:
error: .git/objects/pack/pack-6863e0a0e4b4ded6090fac5d12eba6ca7346b19c.pack SHA1 checksum mismatch
error: index CRC mismatch for object 6c8cae4994b5ec7891ccb1527d30634997a978ee from .git/objects/pack/pack-6863e0a0e4b4ded6090fac5d12eba6ca7346b19c.pack at offset 97824129
error: inflate: data stream error (invalid code lengths set)
error: cannot unpack 6c8cae4994b5ec7891ccb1527d30634997a978ee from .git/objects/pack/pack-6863e0a0e4b4ded6090fac5d12eba6ca7346b19c.pack at offset 97824129
error: inflate: data stream error (invalid stored block lengths)
error: failed to read object 0dcf6723cc69cc7f91d4a7432d0f1a1f05e77eaa at offset 276988017 from .git/objects/pack/pack-6863e0a0e4b4ded6090fac5d12eba6ca7346b19c.pack
fatal: object 0dcf6723cc69cc7f91d4a7432d0f1a1f05e77eaa is corrupted
Saya memiliki cadangan repositori, tetapi satu-satunya cadangan yang menyertakan file paket telah rusak. Jadi saya pikir saya harus mencari cara untuk mengambil objek tunggal dari backup yang berbeda dan entah bagaimana menginstruksikan Git untuk membuat paket baru dengan hanya objek yang benar.
Bisakah Anda memberi saya petunjuk cara memperbaiki repositori saya?
git
corruption
data-recovery
Kristen
sumber
sumber
.git
folder tentunya) ke dalam repo yang baru saja dikloning ... dan kemudian melakukannyagit status
di repo baru ... git dengan benar mendeteksi semua perubahan yang terpengaruh pada file saya dan saya dapat memulai pekerjaan saya lagi.Jawaban:
Dalam beberapa cadangan sebelumnya, objek buruk Anda mungkin telah dikemas dalam file berbeda atau mungkin merupakan objek lepas. Jadi objek Anda dapat dipulihkan.
Sepertinya ada beberapa objek buruk di database Anda. Jadi Anda bisa melakukannya dengan cara manual.
Karena
git hash-object
,git mktree
dangit commit-tree
jangan tulis objek karena ditemukan dalam paket, maka mulailah melakukan ini:(Paket Anda dipindahkan dari repositori, dan dibongkar lagi di dalamnya; hanya objek bagus yang sekarang ada di database)
Anda dapat melakukan:
dan periksa jenis objeknya.
Jika jenisnya adalah blob: ambil konten file dari cadangan sebelumnya (dengan
git show
ataugit cat-file
ataugit unpack-file
; Anda dapatgit hash-object -w
menulis ulang objek tersebut di repositori Anda saat ini.Jika jenisnya adalah pohon: Anda dapat menggunakan
git ls-tree
untuk memulihkan pohon dari cadangan sebelumnya; lalugit mktree
untuk menuliskannya lagi di repositori Anda saat ini.Jika tipenya komit: sama dengan
git show
,git cat-file
dangit commit-tree
.Tentu saja, saya akan membuat cadangan copy pekerjaan asli Anda sebelum memulai proses ini.
Juga, lihat Cara Memulihkan Objek Blob yang Rusak .
sumber
.git/objects/pack/
kosongBanengusk telah menempatkan saya di jalur yang benar. Untuk referensi lebih lanjut, saya ingin memposting langkah-langkah yang saya ambil untuk memperbaiki kerusakan repositori saya. Saya cukup beruntung untuk menemukan semua objek yang dibutuhkan baik dalam paket lama atau dalam cadangan repositori.
sumber
Coba perintah berikut pada awalnya (jalankan kembali jika perlu):
Dan kemudian Anda masih memiliki masalah, coba dapat:
hapus semua objek yang rusak, mis
singkirkan semua benda kosong, mis
periksa pesan "tautan rusak" dengan:
Ini akan memberi tahu Anda dari file apa gumpalan korup itu berasal!
untuk memulihkan file, Anda mungkin sangat beruntung, dan ini mungkin versi yang sudah Anda periksa di pohon kerja Anda:
sekali lagi, dan jika itu mengeluarkan SHA1 (4b945 ..) yang hilang, Anda sekarang sudah selesai!
dengan asumsi bahwa itu adalah versi lama yang rusak, cara termudah untuk melakukannya adalah dengan:
dan itu akan menunjukkan kepada Anda seluruh log untuk file itu (harap diketahui bahwa pohon yang Anda miliki mungkin bukan pohon tingkat atas, jadi Anda perlu mencari tahu sendiri di subdirektori mana), lalu sekarang Anda dapat membuat ulang objek yang hilang dengan hash-object lagi.
untuk mendapatkan daftar semua ref dengan commit, tree, atau blob yang hilang:
Beberapa ref tersebut mungkin tidak dapat dihapus menggunakan perintah branch -d atau tag -d biasa, karena mereka akan mati jika git mengetahui adanya kerusakan. Jadi gunakan perintah pipa git update-ref -d $ ref sebagai gantinya. Perhatikan bahwa dalam kasus cabang lokal, perintah ini mungkin meninggalkan konfigurasi cabang lama di .git / config. Ini dapat dihapus secara manual (cari bagian [cabang "$ ref"]).
Setelah semua ref bersih, mungkin masih ada komitmen yang rusak di reflog. Anda dapat menghapus semua reflog menggunakan git reflog expire --expire = now --all. Jika Anda tidak ingin kehilangan semua reflog Anda, Anda dapat mencari referensi individu untuk reflog yang rusak:
(Perhatikan opsi -g yang ditambahkan ke git rev-list.) Kemudian, gunakan git reflog expire --expire = sekarang $ ref untuk masing-masingnya. Ketika semua ref dan reflog yang rusak hilang, jalankan git fsck --full untuk memeriksa apakah repositori bersih. Benda yang menggantung tidak apa-apa.
Di bawah ini Anda dapat menemukan penggunaan perintah tingkat lanjut yang berpotensi dapat menyebabkan hilangnya data Anda di repositori git jika tidak digunakan dengan bijak, jadi buatlah cadangan sebelum Anda secara tidak sengaja melakukan kerusakan lebih lanjut pada git Anda. Cobalah risiko Anda sendiri jika Anda tahu apa yang Anda lakukan.
Untuk menarik cabang saat ini di atas cabang upstream setelah mengambil:
Anda juga dapat mencoba untuk membayar cabang baru dan menghapus yang lama:
Untuk menemukan objek yang rusak di git untuk dihapus, coba perintah berikut:
Untuk OSX, gunakan
sed -E
bukansed -r
.Ide lainnya adalah membongkar semua objek dari file paket untuk membuat ulang semua objek di dalam .git / objek, jadi cobalah untuk menjalankan perintah berikut di dalam repositori Anda:
Jika di atas tidak membantu, Anda dapat mencoba untuk rsync atau menyalin objek git dari repo lain, mis
Untuk memperbaiki cabang yang rusak saat mencoba melakukan pembayaran sebagai berikut:
Coba hapus dan lakukan pembayaran dari upstream lagi:
Jika git membawa Anda ke status terlepas, lakukan pembayaran
master
dan gabungkan ke dalamnya cabang yang terlepas.Ide lain adalah untuk mendasarkan kembali master yang ada secara rekursif:
Lihat juga:
sumber
Berikut adalah langkah-langkah yang saya ikuti untuk memulihkan dari objek blob yang rusak.
1) Identifikasi gumpalan yang korup
Blob yang rusak adalah 241091723c324aed77b2d35f97a05e856b319efd
2) Pindahkan gumpalan korup ke tempat yang aman (untuk berjaga-jaga)
3) Dapatkan induk dari gumpalan korup
Hash induk adalah 0716831e1a6c8d3e6b2b541d21c4748cc0ce7180 .
4) Dapatkan nama file yang sesuai dengan gumpalan korup
Temukan file khusus ini dalam cadangan atau di repositori git hulu (dalam kasus saya ini adalah dump.tar.gz ). Kemudian salin di suatu tempat di dalam repositori lokal Anda.
5) Tambahkan file yang sebelumnya rusak dalam database objek git
6) Rayakan!
sumber
git ls-tree 9504a07fb803edfdf0c1dd99c5d561274af87982 error: Could not read 19505205fd1f219993da9b75846fff3cf432152d
, dan saya juga mencobanya lagi tanpa Langkah 2, dan itu menghasilkangit ls-tree 9504a07fb803edfdf0c1dd99c5d561274af87982 error: inflate: data stream error (invalid stored block lengths) fatal: failed to read object 19505205fd1f219993da9b75846fff3cf432152d: Invalid argument
Git checkout sebenarnya dapat memilih file individual dari revisi. Berikan saja hash komit dan nama file. Info lebih detail ada di sini.
Saya kira cara termudah untuk memperbaikinya dengan aman adalah dengan kembali ke cadangan terbaru yang tidak terikat dan kemudian secara selektif memilih file yang tidak rusak dari tindakan yang lebih baru. Semoga berhasil!
sumber
Berikut adalah dua fungsi yang dapat membantu jika cadangan Anda rusak, atau Anda juga memiliki beberapa cadangan yang rusak sebagian (ini mungkin terjadi jika Anda membuat cadangan objek yang rusak).
Jalankan keduanya di repo yang Anda coba pulihkan.
Peringatan standar: hanya gunakan jika Anda benar-benar putus asa dan Anda telah mencadangkan repo (rusak) Anda. Ini mungkin tidak menyelesaikan apa pun, tetapi setidaknya harus menyoroti tingkat korupsi.
dan
sumber
Saya telah menyelesaikan masalah ini untuk menambahkan beberapa perubahan seperti git add -A dan git commit lagi.
sumber