Setiap kali saya menarik dari remote saya, saya mendapatkan kesalahan berikut tentang kompresi. Ketika saya menjalankan kompresi manual, saya mendapatkan yang sama:
$ git gc
error: Could not read 3813783126d41a3200b35b6681357c213352ab31
fatal: bad tree object 3813783126d41a3200b35b6681357c213352ab31
error: failed to run repack
Adakah yang tahu, apa yang harus dilakukan?
Dari file-cat saya mendapatkan ini:
$ git cat-file -t 3813783126d41a3200b35b6681357c213352ab31
error: unable to find 3813783126d41a3200b35b6681357c213352ab31
fatal: git cat-file 3813783126d41a3200b35b6681357c213352ab31: bad file
Dan dari git fsck saya mendapatkan ini (tidak tahu apakah ini benar-benar terkait):
$ git fsck
error: inflate: data stream error (invalid distance too far back)
error: corrupt loose object '45ba4ceb93bc812ef20a6630bb27e9e0b33a012a'
fatal: loose object 45ba4ceb93bc812ef20a6630bb27e9e0b33a012a (stored in .git/objects/45/ba4ceb93bc812ef20a6630bb27e9e0b33a012a) is corrupted
Adakah yang bisa membantu saya menguraikan ini?
git
version-control
asgerhallas
sumber
sumber
Jawaban:
Sepertinya Anda memiliki objek pohon korup. Anda harus mendapatkan objek itu dari orang lain. Semoga mereka memiliki versi yang tidak rusak.
Anda benar-benar dapat merekonstruksi jika Anda tidak dapat menemukan versi yang valid dari orang lain dengan menebak file apa yang seharusnya ada. Anda mungkin ingin melihat apakah tanggal & waktu dari objek sesuai dengan itu. Itu bisa menjadi gumpalan terkait. Anda dapat menyimpulkan struktur objek pohon dari objek-objek itu.
Lihatlah Scott Chacon's Git Screencasts tentang git internal. Ini akan menunjukkan kepada Anda bagaimana git bekerja di bawah tenda dan bagaimana cara melakukan pekerjaan detektif ini jika Anda benar-benar terjebak dan tidak bisa mendapatkan objek itu dari orang lain.
sumber
git cat-file -t <SHA1>
akan memberi tahu Anda tipenya. Jika tidak rusak, Anda dapat melakukannyagit cat-file <type> <SHA1>
untuk melihat konten (saya menggunakannya untukblob
, saya kira itu juga akan menunjukkan kepada Anda konten dari jenis lain.)blob
. Namun, ketika saya mengikuti petunjuk ini,git status
meresponsfatal: unable to read <SHA1>
meskipun saya berhasil berlarigit hash-object -w <file>
(mungkin karena, berdasarkan instruksinya, saya telah memindahkan file objek itu. Mengembalikannya hanya memberi sayacorrupt loose object
kesalahan yang sama .)Saya memiliki masalah yang sama (tidak tahu mengapa).
Perbaikan ini membutuhkan akses ke salinan repositori jarak jauh yang tidak rusak, dan akan membuat salinan lokal Anda tetap berfungsi.
Tetapi memiliki beberapa kelemahan:
Cara mengatasinya
Jalankan perintah ini dari direktori induk di atas repo Anda (ganti 'foo' dengan nama folder proyek Anda):
cp -R foo foo-backup
git clone [email protected]:foo foo-newclone
rm -rf foo/.git
mv foo-newclone/.git foo
rm -rf foo-newclone
Di Windows Anda harus menggunakan:
copy
dari padacp -R
rmdir /S
dari padarm -rf
move
dari padamv
Sekarang foo memiliki
.git
subdirektori aslinya kembali, tetapi semua perubahan lokal masih ada.git status
,commit
,pull
,push
, Dll bekerja lagi sebagaimana mestinya.sumber
.git
folder.Taruhan terbaik Anda mungkin adalah dengan hanya mengkloning ulang dari repo jarak jauh (mis. Github atau lainnya). Sayangnya, Anda akan kehilangan komitmen yang tidak dicopot dan menyembunyikan perubahan, namun copy pekerjaan Anda tetap utuh.
Pertama buat salinan cadangan dari file lokal Anda. Kemudian lakukan ini dari akar pohon kerja Anda:
Kemudian komit setiap file yang diubah seperlunya.
sumber
master
dengan nama cabang Anda.working
ketika rusak dan langkah-langkah ini tidak memberi saya salinan lokal dari cabang lain selain master (dan ya saya telah mencoba mengganti master di atas denganworking
tetapi itu tidak berhasil). Akhirnya melakukan langkah-langkah di atas denganmaster
, kemudian menyembunyikan perubahan saya dan melakukancheckout -b working origin/working
dan muncul simpanan di sana. Tampaknya telah bekerja - terima kasih!git status
dihasilkanfatal: Not a git repository: submodules/my-sub/../../.git/modules/my-sub
. Menghapus submodule dari sistem file dan memulai kembali proses mengembalikan normalitas. Mungkin memastikan tidak ada perubahan un-push dalam submodul yang pertama adalah ide yang bagus ...Bekerja pada VM, di notebook saya, baterai mati, mendapat kesalahan ini;
Saya berhasil membuat repo berfungsi lagi dengan hanya 2 perintah dan tanpa kehilangan pekerjaan saya (file yang dimodifikasi / perubahan yang tidak dikomit)
Setelah itu saya menjalankan
git status
, repo baik-baik saja dan ada perubahan saya (menunggu untuk dilakukan, lakukan sekarang ..).git versi 1.9.1
Ingatlah untuk mencadangkan semua perubahan yang Anda ingat, kalau-kalau solusi ini tidak berfungsi dan diperlukan pendekatan yang lebih radikal.
sumber
find .git/objects/ -size 0 -exec rm -f {} \;
bekerja untuk saya;)git symbolic-ref HEAD refs/heads/master.
setelah menghapus objek yang kosong.Komputer saya macet ketika saya sedang menulis pesan komit. Setelah reboot, pohon yang berfungsi adalah seperti yang saya tinggalkan dan saya berhasil melakukan perubahan.
Namun, ketika saya mencoba lari,
git status
saya dapatTidak seperti kebanyakan jawaban lain, saya tidak mencoba memulihkan data apa pun . Saya hanya perlu Git untuk berhenti mengeluh tentang file objek kosong.
Gambaran
"File objek" adalah representasi hash git dari file nyata yang Anda sayangi. Git berpikir itu seharusnya memiliki versi hashed yang
some/file.whatever
tersimpan.git/object/xx/12345
, dan memperbaiki kesalahan ternyata sebagian besar masalah mencari tahu file mana "objek longgar" yang seharusnya diwakili.Detail
Pilihan yang mungkin tampak
Pendekatan 1: Hapus file objek
Hal pertama yang saya coba hanyalah memindahkan file objek
Itu tidak berhasil - git mulai mengeluh tentang tautan yang rusak. Aktif ke Pendekatan 2.
Pendekatan 2: Perbaiki file
Linus Torvalds memiliki writeup yang bagus tentang bagaimana memulihkan file objek yang memecahkan masalah bagi saya. Langkah-langkah utama dirangkum di sini.
Ini memberitahu Anda apa file objek kosong seharusnya menjadi hash. Sekarang kamu bisa memperbaikinya.
Setelah melakukan ini saya memeriksa
.git/objects/xx/12345
, itu tidak lagi kosong, dan git berhenti mengeluh.sumber
Mencoba
Ini berhasil untuk saya. Ini menyembunyikan apa pun yang belum Anda lakukan dan yang mengatasi masalah.
sumber
git stash
... fatal: Tidak dapat membuat '/ home / <user> /.git/index.lock':touch .git/a
Sentuhan kesalahan input / output : tidak dapat menyentuh '. Git / a': Kesalahan input / outputsudo touch /home/guest/.git/a
NO KESALAHANgit stash
Tidak perubahan lokal untuk menyimpangit status
... tidak ada komitmen, direktori kerja bersihKumpulan sampah memperbaiki masalah saya:
Butuh beberapa saat untuk menyelesaikan, tetapi setiap objek longgar dan / atau indeks rusak diperbaiki.
sumber
cukup menjalankan
git prune
perbaikan masalah ini untuk sayasumber
git pull
membutuhkan waktu sedikit lebih lama dari biasanya, saya kira karena itu mengganti beberapa benda yang dihapus atau sesuatu.Saya baru saja mengalami ini - mesin saya mogok saat menulis ke repo Git, dan menjadi rusak. Saya memperbaikinya sebagai berikut.
Saya mulai dengan melihat berapa banyak komit yang belum saya mendorong ke repo jarak jauh, dengan demikian:
Jika Anda tidak menggunakan alat ini sangat berguna - tersedia di semua sistem operasi sejauh yang saya tahu. Ini menunjukkan bahwa remote saya kehilangan dua komit. Oleh karena itu saya mengklik label yang menunjukkan komit jarak jauh terbaru (biasanya ini akan
/remotes/origin/master
) untuk mendapatkan hash (hash panjangnya 40 karakter, tetapi untuk singkatnya saya menggunakan 10 di sini - ini biasanya tetap berfungsi).Ini dia:
Saya kemudian klik pada komit berikut (yaitu yang pertama yang tidak dimiliki remote) dan mendapatkan hash di sana:
Saya kemudian menggunakan keduanya untuk membuat patch untuk komit ini:
Saya kemudian melakukan hal yang sama dengan komit yang hilang lainnya, yaitu saya menggunakan hash dari commit sebelumnya dan hash dari commit itu sendiri:
Saya kemudian pindah ke direktori baru, mengkloning repo dari jarak jauh:
Saya kemudian memindahkan file tambalan ke folder baru, dan menerapkannya dan mengkomitnya dengan pesan komit yang tepat (ini dapat ditempel dari
git log
ataugitk
jendela):Ini memulihkan hal-hal untuk saya (dan perhatikan mungkin ada cara yang lebih cepat untuk melakukannya untuk sejumlah besar komitmen). Namun saya ingin melihat apakah pohon di repo yang rusak dapat diperbaiki, dan jawabannya adalah bisa. Dengan repo yang diperbaiki tersedia di atas, jalankan perintah ini di folder yang rusak:
Anda akan mendapatkan sesuatu seperti ini:
Untuk melakukan perbaikan, saya akan melakukan ini di folder yang rusak:
yaitu menghapus file yang rusak dan menggantinya dengan yang baik. Anda mungkin harus melakukan ini beberapa kali. Akhirnya akan ada titik di mana Anda dapat menjalankan
fsck
tanpa kesalahan. Anda mungkin akan memiliki garis "menggantung komit" dan "menggantung gumpalan" dalam laporan, ini adalah konsekuensi dari rebases Anda dan mengubah dalam folder ini, dan itu OK. Pengumpul sampah akan menghapusnya pada waktunya.Jadi (setidaknya dalam kasus saya) pohon yang rusak tidak berarti komitmen yang tidak dicuri akan hilang.
sumber
Saya mendapatkan kesalahan objek longgar korup juga.
Saya berhasil memperbaikinya dengan masuk ke direktori objek yang rusak. Saya melihat bahwa pengguna yang ditugaskan ke objek itu bukan pengguna git saya. Saya tidak tahu bagaimana itu terjadi, tetapi saya menjalankan
chown git:git
file itu dan kemudian bekerja lagi.Ini mungkin merupakan perbaikan potensial untuk masalah beberapa orang tetapi tidak perlu semuanya.
sumber
Saya mendapatkan kesalahan ini setelah mesin (windows) saya memutuskan untuk reboot sendiri. Untungnya repo jarak jauh saya sudah mutakhir, jadi saya baru saja melakukan kloning git ..
sumber
Runnning
git stash; git stash pop
memperbaiki masalah sayasumber
Saya mengikuti banyak langkah lain di sini; Deskripsi Linus tentang cara melihat pohon git / objek dan menemukan apa yang hilang sangat membantu. git-git memulihkan gumpalan rusak
Tetapi pada akhirnya, bagi saya, saya memiliki objek pohon longgar / rusak yang disebabkan oleh kegagalan sebagian disk, dan objek pohon tidak begitu mudah dipulihkan / tidak tercakup oleh dokumen itu.
Pada akhirnya, saya memindahkan yang bertentangan
objects/<ha>/<hash>
keluar dari jalan, dan digunakangit unpack-objects
dengan file paket dari klon yang cukup mutakhir. Itu mampu mengembalikan objek pohon yang hilang.Masih meninggalkan saya dengan banyak gumpalan menjuntai, yang dapat menjadi efek samping dari membongkar barang-barang yang sebelumnya diarsipkan, dan dibahas dalam pertanyaan lain di sini
sumber
Sebagai jawaban dari @ user1055643 hilang langkah terakhir:
sumber
.git
dan menyalin dari proyek kloning, repo akan berfungsi, tetapi tidak ada cabang lokal, atau simpanan yang akan disimpan.Kami baru saja membawa kopernya di sini. Terjadi bahwa masalahnya adalah kepemilikan file yang rusak adalah root, bukan pengguna normal kami. Ini disebabkan oleh komit yang dilakukan pada server setelah seseorang melakukan "sudo su -".
Pertama, kenali file Anda yang rusak dengan:
Anda harus menerima jawaban seperti ini:
Buka folder tempat file korup berada dan lakukan:
Periksa kepemilikan file yang rusak. Jika itu berbeda, kembali saja ke root repo Anda dan lakukan:
Semoga ini bisa membantu!
sumber
Bagi saya ini terjadi karena kegagalan daya saat melakukan a
git push
.Pesannya terlihat seperti ini:
Saya mencoba hal-hal seperti
git fsck
tetapi itu tidak membantu. Karena crash terjadi selamagit push
, itu jelas terjadi selama penulisan ulang di sisi klien yang terjadi setelah server diperbarui. Saya melihat sekeliling dan menemukan bahwac2388
dalam kasus saya adalah objek komit, karena dirujuk oleh entri di.git/refs
. Jadi saya tahu bahwa saya akan dapat menemukanc2388
ketika saya melihat sejarah (melalui antarmuka web atau klon kedua).Pada klon kedua saya melakukan
git log -n 2 c2388
untuk mengidentifikasi pendahulunyac2388
. Kemudian saya secara manual dimodifikasi.git/refs/heads/master
dan.git/refs/remotes/origin/master
menjadi pendahuluc2388
alih-alihc2388
. Maka saya bisa melakukangit fetch
. Thegit fetch
gagal beberapa kali konflik pada objek kosong. Saya menghapus masing-masing benda kosong ini sampaigit fetch
berhasil. Itu telah menyembuhkan repositori.sumber
Saya memecahkan masalah ini: Saya memutuskan untuk hanya menyalin file objek yang tidak rusak dari klon cadangan ke repositori asli saya. Ini berhasil juga. (Ngomong-ngomong: Jika Anda tidak dapat menemukan objek di .git / objek / dengan namanya, itu mungkin telah [dikemas] [paket] untuk menghemat ruang.)
sumber
Saya memiliki masalah yang sama pada repo git saya yang sederhana. Setelah banyak pemecahan masalah, saya menemukan salah satu rekan kerja saya telah membuat komit di mana beberapa file di .git / objek memiliki izin 440 (r - r -----) daripada 444 (r - r - r -). Setelah meminta rekan kerja untuk mengubah izin dengan "chmod 444 -R objek" di dalam bare git repo, masalahnya diperbaiki.
sumber
Saya hanya punya masalah seperti ini. Masalah khusus saya disebabkan oleh sistem crash yang merusak komit terbaru (dan karenanya juga cabang master). Saya tidak mendorong, dan ingin membuat kembali komitmen itu. Dalam kasus khusus saya, saya bisa menghadapinya seperti ini:
.git/
:rsync -a .git/ git-bak/
.git/logs/HEAD
, dan temukan baris terakhir dengan ID komit yang valid. Bagi saya, ini adalah komit terbaru kedua. Ini bagus, karena saya masih memiliki versi direktori file yang berfungsi, dan setiap versi yang saya inginkan.git branch temp <commit-id>
git reset master temp
untuk memindahkan cabang master ke komit baru yang Anda buat pada langkah 2.git checkout master
dan periksa apakah itu benargit log
.git branch -d temp
.git fsck --full
, dan sekarang seharusnya aman untuk menghapus objek yang rusak yang ditemukan fsck.Itu berhasil untuk saya. Saya menduga ini adalah skenario yang cukup umum, karena komit terbaru adalah yang paling mungkin rusak, tetapi jika Anda kehilangan satu lagi, Anda mungkin masih dapat menggunakan metode seperti ini, dengan penggunaan hati-hati
git cherrypick
, dan reflog di.git/logs/HEAD
.sumber
Ketika saya memiliki masalah ini, saya mendukung perubahan terbaru saya (karena saya tahu apa yang telah saya ubah) kemudian menghapus file yang dikeluhkannya di .git / lokasi. Lalu aku melakukan git pull. Berhati-hatilah, ini mungkin tidak berhasil untuk Anda.
sumber
Saya mengalami ini setelah sistem saya crash. Apa yang saya lakukan adalah ini:
(Harap perhatikan bahwa komit korup Anda hilang, tetapi perubahan tetap dipertahankan. Anda mungkin harus membuat ulang komit tersebut di akhir prosedur ini)
.git
folder..git
folder di dalamnya.sumber
Hapus saja folder .git dan tambahkan lagi. Solusi sederhana ini berhasil untuk saya.
sumber
.git
, dan menyalin dari proyek yang dikloning, repo akan berfungsi, tetapi tidak ada cabang lokal, atau simpanan yang akan disimpan. Juga, saran yang ramah, hapus jawaban Anda sepenuhnya untuk berhenti menerima suara turun.