Bagaimana cara memperbaiki kesalahan GIT: file objek kosong?

442

Ketika saya mencoba melakukan perubahan, saya mendapatkan kesalahan ini:

error: object file .git/objects/31/65329bb680e30595f242b7c4d8406ca63eeab0 is empty
fatal: loose object 3165329bb680e30595f242b7c4d8406ca63eeab0 (stored in .git/objects/31/65329bb680e30595f242b7c4d8406ca63eeab0) is corrupt

Adakah cara untuk mengatasi kesalahan ini?

EDIT

Saya sudah mencoba git fsck:

error: object file .git/objects/03/dfd60a4809a3ba7023cbf098eb322d08630b71 is empty
fatal: loose object 03dfd60a4809a3ba7023cbf098eb322d08630b71 (stored in .git/objects/03/dfd60a4809a3ba7023cbf098eb322d08630b71) is corrupt
simo
sumber
Apakah Anda secara paksa membunuh git addoperasi? Apakah hard disk Anda penuh?
cdhowie
Tidak, hard disk saya tidak penuh, saya tidak ingat bahwa saya secara paksa membunuh operasi git add, bagaimana jika saya melakukannya? Bagaimana saya bisa memecahkan masalah ini ?
Simo
tidak, kesalahannya masih ada ...
simo
2
Jika repositori ini ada pada repositori jarak jauh, Anda bisa mencoba menyalin file itu dari sana ke repositori lokal Anda jika ada di repositori jauh Anda.
Attila Szeremi
2
Saya mendapatkan kesalahan ini ketika izin saya di direktori .git entah bagaimana kacau dan saya tidak memiliki akses baca. Jadi itu bisa terjadi dalam kasus di mana file tidak kosong tetapi mereka tidak dapat ditulis. Memperbaiki izin dan menjalankannya bisa git fsckmenanganinya.
Jake Anderson

Jawaban:

899

Saya punya masalah serupa. Laptop saya kehabisan baterai selama operasi git. Boo.

Saya tidak punya cadangan. (NB Ubuntu One bukan solusi cadangan untuk git; ini akan sangat membantu menimpa repositori waras Anda dengan yang rusak.)

Untuk para penyihir git, jika ini cara yang buruk untuk memperbaikinya, silakan tinggalkan komentar. Namun, itu berhasil bagi saya ... setidaknya untuk sementara.

Langkah 1: Buat cadangan .git (sebenarnya saya melakukan ini di antara setiap langkah yang mengubah sesuatu, tetapi dengan nama copy-to yang baru, misalnya .git-old-1, .git-old-2, dll.) :

cp -a .git .git-old

Langkah 2: Jalankan git fsck --full

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git fsck --full
error: object file .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e is empty
fatal: loose object 8b61d0135d3195966b443f6c73fb68466264c68e (stored in .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e) is corrupt

Langkah 3: Hapus file kosong. Saya pikir apa-apaan itu; itu tetap kosong.

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ rm .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e 
rm: remove write-protected regular empty file `.git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e'? y

Langkah 3: Jalankan git fscklagi. Lanjutkan menghapus file yang kosong. Anda juga dapat cdmasuk ke .gitdirektori dan menjalankan find . -type f -empty -delete -printuntuk menghapus semua file kosong. Akhirnya git mulai memberi tahu saya bahwa itu sebenarnya melakukan sesuatu dengan direktori objek:

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git fsck --full
Checking object directories: 100% (256/256), done.
error: object file .git/objects/e0/cbccee33aea970f4887194047141f79a363636 is empty
fatal: loose object e0cbccee33aea970f4887194047141f79a363636 (stored in .git/objects/e0/cbccee33aea970f4887194047141f79a363636) is corrupt

Langkah 4: Setelah menghapus semua file kosong, saya akhirnya git fsckbenar - benar menjalankan:

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git fsck --full
Checking object directories: 100% (256/256), done.
error: HEAD: invalid sha1 pointer af9fc0c5939eee40f6be2ed66381d74ec2be895f
error: refs/heads/master does not point to a valid object!
error: refs/heads/master.u1conflict does not point to a valid object!
error: 0e31469d372551bb2f51a186fa32795e39f94d5c: invalid sha1 pointer in cache-tree
dangling blob 03511c9868b5dbac4ef1343956776ac508c7c2a2
missing blob 8b61d0135d3195966b443f6c73fb68466264c68e
missing blob e89896b1282fbae6cf046bf21b62dd275aaa32f4
dangling blob dd09f7f1f033632b7ef90876d6802f5b5fede79a
missing blob caab8e3d18f2b8c8947f79af7885cdeeeae192fd
missing blob e4cf65ddf80338d50ecd4abcf1caf1de3127c229

Langkah 5: Coba git reflog. Gagal karena KEPALA saya rusak.

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git reflog
fatal: bad object HEAD

Langkah 6: Google. Temukan ini . Dapatkan dua baris reflog terakhir secara manual:

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ tail -n 2 .git/logs/refs/heads/master
f2d4c4868ec7719317a8fce9dc18c4f2e00ede04 9f0abf890b113a287e10d56b66dbab66adc1662d Nathan VanHoudnos <[email protected]> 1347306977 -0400  commit: up to p. 24, including correcting spelling of my name
9f0abf890b113a287e10d56b66dbab66adc1662d af9fc0c5939eee40f6be2ed66381d74ec2be895f Nathan VanHoudnos <[email protected]> 1347358589 -0400  commit: fixed up to page 28

Langkah 7: Perhatikan bahwa dari Langkah 6 kami mengetahui bahwa KEPALA saat ini menunjuk ke komitmen terakhir. Jadi mari kita coba lihat komit induk:

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git show 9f0abf890b113a287e10d56b66dbab66adc1662d
commit 9f0abf890b113a287e10d56b66dbab66adc1662d
Author: Nathan VanHoudnos <nathanvan@XXXXXX>
Date:   Mon Sep 10 15:56:17 2012 -0400

    up to p. 24, including correcting spelling of my name

diff --git a/tex/MCMC-in-IRT.tex b/tex/MCMC-in-IRT.tex
index 86e67a1..b860686 100644
--- a/tex/MCMC-in-IRT.tex
+++ b/tex/MCMC-in-IRT.tex

Berhasil!

Langkah 8: Jadi sekarang kita perlu mengarahkan HEAD ke 9f0abf890b113a287e10d56b66dbab66adc1662d.

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git update-ref HEAD 9f0abf890b113a287e10d56b66dbab66adc1662d

Yang tidak mengeluh.

Langkah 9: Lihat apa yang dikatakan fsck:

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git fsck --full
Checking object directories: 100% (256/256), done.
error: refs/heads/master.u1conflict does not point to a valid object!
error: 0e31469d372551bb2f51a186fa32795e39f94d5c: invalid sha1 pointer in cache-tree
dangling blob 03511c9868b5dbac4ef1343956776ac508c7c2a2
missing blob 8b61d0135d3195966b443f6c73fb68466264c68e
missing blob e89896b1282fbae6cf046bf21b62dd275aaa32f4
dangling blob dd09f7f1f033632b7ef90876d6802f5b5fede79a
missing blob caab8e3d18f2b8c8947f79af7885cdeeeae192fd
missing blob e4cf65ddf80338d50ecd4abcf1caf1de3127c229

Langkah 10: Pointer sha1 yang tidak valid di cache-tree sepertinya berasal dari file index ( sumber yang sudah ketinggalan zaman ). Jadi saya membunuhnya dan mengatur ulang repo.

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ rm .git/index
nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git reset
Unstaged changes after reset:
M   tex/MCMC-in-IRT.tex
M   tex/recipe-example/build-example-plots.R
M   tex/recipe-example/build-failure-plots.R

Langkah 11: Melihat fsck lagi ...

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git fsck --full
Checking object directories: 100% (256/256), done.
error: refs/heads/master.u1conflict does not point to a valid object!
dangling blob 03511c9868b5dbac4ef1343956776ac508c7c2a2
dangling blob dd09f7f1f033632b7ef90876d6802f5b5fede79a

The gumpalan menggantung tidak kesalahan . Saya tidak peduli dengan master.u1conflict, dan sekarang sudah berfungsi saya tidak ingin menyentuhnya lagi!

Langkah 12: Mengejar suntingan lokal saya:

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   tex/MCMC-in-IRT.tex
#   modified:   tex/recipe-example/build-example-plots.R
#   modified:   tex/recipe-example/build-failure-plots.R
#
< ... snip ... >
no changes added to commit (use "git add" and/or "git commit -a")


nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git commit -a -m "recovering from the git fiasco"
[master 7922876] recovering from the git fiasco
 3 files changed, 12 insertions(+), 94 deletions(-)

nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git add tex/sept2012_code/example-code-testing.R
nathanvan@nathanvan-N61Jq:~/workspace/mcmc-chapter$ git commit -a -m "adding in the example code"
[master 385c023] adding in the example code
 1 file changed, 331 insertions(+)
 create mode 100644 tex/sept2012_code/example-code-testing.R

Jadi mudah-mudahan itu dapat bermanfaat bagi orang-orang di masa depan. Saya senang itu berhasil.

Nathan VanHoudnos
sumber
86
Jawaban yang sangat baik, bersama dengan semua langkah dan semua. Saya kira Anda menyelamatkan saya dari googling masing-masing dan semua itu!
Zlatko
24
Bekerja seperti pesona! Saya berharap saya bisa membenarkan ini beberapa kali;)
MarcDefiant
1
Hmm, laptop saya mati selama operasi git (SparkleShare mencoba untuk melakukan catatan saya saat mati) dan setelah itu repo rusak dengan cara ini. Saya mengikuti langkah Anda hingga 6 tetapi sepertinya beberapa komit terakhir sebenarnya seharusnya menjadi bagian dari file objek kosong yang saya hapus? Sebenarnya 3 komit terakhir pada dasarnya benar-benar rusak, jadi saya kira tidak ada yang bisa saya lakukan. Untungnya saya tidak benar-benar membutuhkan komitmen individu dari SparkleShare dan saya bisa menyalin file kotor dari satu mesin ke komputer lain dan bergabung.
Ibrahim
14
Luar biasa, jawaban yang luar biasa. Terima kasih terutama untuk memasukkan alasan Anda di balik setiap langkah. Anda telah menyimpan repo saya! (Yah, saya masih memiliki kesalahan 'ref buruk untuk ref / kepala / master' dari fsck, tapi itu relatif ringan.)
Jon Carter
3
Terima kasih, saya belajar banyak tentang beberapa fungsionalitas git dan juga menghemat bacon saya di komit penting! Kebetulan itu juga karena baterai rendah pada laptop.
HarbyUK
195

File objek git sudah rusak (seperti yang ditunjukkan dalam jawaban lain juga). Ini bisa terjadi selama mesin crash, dll.

Saya memiliki hal yang sama. Setelah membaca jawaban teratas lainnya di sini saya menemukan cara tercepat untuk memperbaiki repositori git yang rusak dengan perintah berikut (jalankan di direktori kerja git yang berisi .gitfolder):

(Pastikan untuk membuat cadangan folder repositori git Anda terlebih dahulu!)

find .git/objects/ -type f -empty | xargs rm
git fetch -p
git fsck --full

Ini pertama-tama akan menghapus semua file objek kosong yang menyebabkan kerusakan repositori secara keseluruhan, dan kemudian mengambil objek yang hilang (serta perubahan terbaru) dari repositori jarak jauh, dan kemudian melakukan pengecekan toko objek penuh . Yang, pada titik ini, harus berhasil tanpa kesalahan (mungkin masih ada beberapa peringatan!)

PS. Jawaban ini menyarankan Anda memiliki salinan jauh dari repositori git Anda di suatu tempat (mis. Di GitHub) dan repositori yang rusak adalah repositori lokal yang terkait dengan repositori jarak jauh yang masih berlaku. Jika bukan itu masalahnya, maka jangan mencoba memperbaikinya seperti yang saya sarankan.

Martin Tajur
sumber
Terima kasih untuk ini, saya dengan religius mendorong ke cabang-cabang terpencil saya dan solusi Anda berhasil untuk saya. Saya mencoba @ mCorr's di bawah ini terlebih dahulu tetapi setelah saya melakukan file baru repo kembali menjadi rusak. Pendekatan ini menyelesaikannya
mr_than
karena sebagian besar memiliki remote. Solusi ini sangat bersih dan memadai.
jackOfAll
7
Punya masalah ini setelah mematikan VM di mana saya bekerja dengan repo git. Solusi ini bekerja dengan sempurna.
Giscard Biamby
Terima kasih Martin, solusi yang sangat baik dan ringkas. Meskipun saya mungkin menempatkan PS itu terlebih dahulu, dengan peringatan dalam huruf tebal, untuk mencegah pengguna yang naif mencoba hal yang sama pada pengaturan hanya-lokal. Seperti Giscard, ini muncul untuk saya ketika mematikan VM ... akan memperbarui jika saya menemukan solusi yang lebih permanen daripada melakukan ini setiap kali.
thclark
2
Seorang naksir VM melakukan ini pada
repositori
35

Kesalahan ini terjadi pada saya ketika saya mendorong komit saya dan komputer saya hang. Beginilah cara saya memperbaikinya.


Langkah-langkah untuk memperbaikinya

git status

perlihatkan file objek kosong / rusak

rm .git/objects/08/3834cb34d155e67a8930604d57d3d302d7ec12

Singkirkan

git status

Saya mendapat fatal: bad object HEADpesan

rm .git/index

Saya menghapus indexuntuk reset

git reset

fatal: Tidak dapat menguraikan objek 'KEPALA'.

git status
git pull

hanya untuk memeriksa apa yang terjadi

tail -n 2 .git/logs/refs/heads/MY-CURRENT-BRANCH

mencetak 2 baris terakhir tail -n 2cabang log untuk menunjukkan 2 terakhir sayacommit hash

git update-ref HEAD 7221fa02cb627470db163826da4265609aba47b2

Saya memilih yang terakhir commit hash

git status

menunjukkan semua file saya deletedkarena saya menghapus .git/indexfile

git reset

lanjutkan ke reset

git status

verifikasi perbaikan saya


Catatan: Langkah-langkah dimulai ketika saya mendarat di pertanyaan ini dan menggunakan jawaban sebagai referensi.

marlo
sumber
34

Saya memecahkan masalah ini dengan menghapus berbagai file kosong yang terdeteksi git fsck, dan kemudian menjalankan tarikan git sederhana.

Saya merasa mengecewakan bahwa sekarang bahkan sistem file menerapkan penjurnalan dan teknik "transaksional" lainnya untuk menjaga fs tetap waras, git dapat mencapai keadaan rusak (dan tidak dapat pulih dengan sendirinya) karena kegagalan daya atau ruang pada perangkat.

Simone Gianni
sumber
3
Saya yakin bahwa jawaban di atas secara teknis lebih baik, tetapi berhenti bekerja pada langkah 6 dan jauh di atas kepala saya secara teknis. Pendekatan yang bijaksana adalah git pull
mblackwell8
2
Saya menghadapi situasi di mana, setelah melakukan langkah 1-11 instruksi dari jawaban Nathan (yang bekerja sangat baik!), Saya memiliki kesalahan yang mengatakan referensi / asal / master dan referensi / asal / kepala tidak didefinisikan (atau sesuatu seperti bahwa). git pull memperbaikinya. Jadi saya pikir kedua solusi bekerja bersama.
bchurchill
2
Saya sadar bahwa filesystem yang digunakan biasanya hanya menjurnal meta-data saja. Anda dapat mengaktifkan penjurnalan untuk data juga, tapi saya kira itu bukan default karena overhead (?) Mungkin itu sebabnya file-file itu kosong .... dan filesystem biasanya mengamati transaksi per file, sedangkan git memiliki banyak file yang sedang dimodifikasi per transaksi, jadi bahkan jika fs menjaga konsistensi per file, jika git tidak, maka saya kira git akan menghasilkan keadaan yang tidak konsisten ...
Heartinpiece
Jawaban ini berhasil bagi saya, orang lain adalah cara yang rumit.
ldog
1
Solusi yang jauh lebih cepat dari jawaban yang diterima. Untuk semua orang yang telah menggulir sejauh ini, ikuti jawaban ini jika Anda sedang terburu-buru.
Sri Harsha Kappala
9

Saya baru saja mengalami masalah yang sama: setelah menarik repositori yang jauh, ketika saya melakukan status git saya mendapat: "error: file objek (...) kosong" "fatal: longgar objek (...) rusak"

Cara saya menyelesaikan ini adalah:

  1. simpanan git
  2. menghapus file git karena kesalahan (tidak yakin itu perlu)
  3. git simpanan jelas

Saya tidak tahu persis apa yang terjadi, tetapi instruksi itu membuat semuanya bersih.

Nicolas
sumber
2
Saya selalu suka jawaban yang lebih sederhana :) Untuk Langkah 2 di sini saya menggunakan perintah yang disediakan dalam jawaban @Nathan VanHoudnos:cd .git/ && find . -type f -empty -delete
mopo922
8

Karena saya harus reboot VM saya secara teratur, jadi entah bagaimana masalah ini sangat sering terjadi pada saya. Setelah beberapa kali, saya menyadari bahwa saya tidak dapat mengulangi proses yang dijelaskan oleh @ Nathan-Vanhoudnos setiap kali ini terjadi, meskipun selalu berhasil. Kemudian saya menemukan solusi lebih cepat berikut.

Langkah 1

Pindahkan seluruh repo Anda ke folder lain.

mv current_repo temp_repo

Langkah 2

Kloning repo dari asal lagi.

git clone source_to_current_repo.git

Langkah 3

Hapus Semuanya di bawah repo baru kecuali folder .git .

Langkah 4

Pindahkan Semuanya dari temp_repo ke repo baru kecuali yang git folder.

Langkah 5

Hapus temp_repo , dan kita selesai.

Setelah beberapa kali, saya yakin Anda dapat melakukan prosedur ini dengan sangat cepat.

haoqiang
sumber
2
Atau jangan pindahkan repo Anda saat ini, 1) buat klon baru git clone source_to_current_repo.git clean_repo, 2) buat cadangan folder .git lama, 3) salin ke folder .git yang bersih.
moi
Kamu benar. Saya sudah melakukannya sekarang. Akan mengedit jawabannya nanti.
haoqiang
@haoqiang: Anda menulis "Karena saya harus me-reboot VM saya secara teratur, jadi entah bagaimana masalah ini sering terjadi pada saya." Kami mengalami hal yang sama. Sudahkah Anda membuat kemajuan pada penyebab utama - pengaturan VM yang membuat masalah lebih jarang terjadi?
hansfn
6
  1. mv aplikasi folder Anda untuk membuat cadangan, yaitu mv app_folder app_folder_bk (itu seperti simpanan git )
  2. git clone your_repository
  3. Akhirnya,. Buka alat penggabung (saya menggunakan linux viewer meld diff atau Winmerge Windows) dan salin perubahan dari kanan ( app_folder_bk ) ke kiri ( app_folder baru ) (ini seperti git simpanan berlaku ).

Itu saja. Mungkin itu bukan cara terbaik, tapi saya pikir ini sangat praktis.

cyberfranco
sumber
1
Ini yang harus Anda lakukan ketika semua perubahan lokal didorong ke hulu, atau perubahan minimal, sehingga kloning lebih cepat daripada pemulihan.
mu 無
3

Dalam kasus saya, kesalahan ini terjadi karena saya mengetik pesan komit dan notebook saya dimatikan.

Saya melakukan langkah-langkah ini untuk memperbaiki kesalahan:

  • git checkout -b backup-branch # Buat cabang cadangan
  • git reset --hard HEAD~4# Reset ke komit di mana semuanya bekerja dengan baik. Dalam kasus saya, saya harus mendukung 4 commit di kepala, yaitu sampai kepala saya berada di titik sebelum saya mengetik pesan commit. Sebelum melakukan langkah ini, salin hash dari commit yang akan Anda atur ulang, dalam kasus saya, saya menyalin hash dari 4 commit terakhir.
  • git cherry-pick <commit-hash> # Cherry memilih komit yang direset (dalam kasus saya adalah 4 komit, jadi saya melakukan langkah ini 4 kali) dari cabang lama ke cabang baru.
  • git push origin backup-branch # Dorong cabang baru untuk memastikan semuanya bekerja dengan baik
  • git branch -D your-branch # Hapus cabang secara lokal ('cabang Anda' adalah cabang yang bermasalah)
  • git push origin :your-branch # Hapus cabang dari jarak jauh
  • git branch -m backup-branch your-branch # Ganti nama cabang cadangan untuk memiliki nama cabang yang memiliki masalah
  • git push origin your-branch # Dorong cabang baru
  • git push origin :backup-branch # Hapus cabang cadangan dari jarak jauh
androidevil
sumber
3
git stash
git checkout master
cd .git/ && find . -type f -empty -delete
git branch your-branch-name -D
git checkout -b your-branch-name
git stash pop

selesaikan masalah saya

Gui-yi
sumber
ini membantu. Terima kasih.
swateek
Jika repo bersih, Anda hanya perlu "cd .git / && menemukan. -Type f -empty -delete && cd - && git pull", Anda mungkin perlu checkout beberapa file git statuskarena sebagian kosong.
CodyChan
2

Ini adalah cara yang sangat sederhana dan cepat untuk mengatasi masalah ini JIKA Anda memiliki repo lokal dengan semua cabang dan komit yang Anda butuhkan, dan jika Anda boleh membuat repo baru (atau menghapus repo server dan membuat repo server yang baru dan membuat yang baru di tempatnya):

  1. Buat repo kosong baru di server (atau hapus repo lama dan buat repo baru di tempatnya)
  2. Ubah URL jarak jauh dari salinan lokal Anda untuk menunjuk ke URL jarak jauh dari repo baru.
  3. Dorong semua cabang dari repo lokal Anda ke repo server baru.

Ini menyimpan semua sejarah komit dan cabang yang Anda miliki di repo lokal Anda.

Jika Anda memiliki kolaborator di repo, maka saya pikir dalam banyak kasus semua kolaborator Anda harus lakukan adalah mengubah URL jauh dari repo lokal mereka juga, dan secara opsional mendorong setiap komitmen yang mereka miliki yang tidak dimiliki server.

Solusi ini bekerja untuk saya ketika saya mengalami masalah yang sama. Saya punya satu kolaborator. Setelah saya mendorong repo lokal saya ke repo jarak jauh yang baru, ia hanya mengubah repo lokalnya untuk menunjuk ke URL repo jarak jauh dan semuanya bekerja dengan baik.

David French
sumber
2

Saya berasumsi Anda memiliki remote dengan semua perubahan yang relevan sudah didorong untuk itu. Saya tidak peduli dengan perubahan lokal dan hanya ingin menghindari menghapus dan menyusun kembali repositori besar. Jika Anda memiliki perubahan lokal yang penting, Anda mungkin ingin lebih berhati-hati.

Saya memiliki masalah yang sama setelah laptop saya mogok. Mungkin karena itu adalah repositori besar, saya mempunyai beberapa file objek korup, yang hanya muncul satu per satu saat memanggil git fsck --full, jadi saya menulis sebuah shell kecil satu-liner untuk secara otomatis menghapus salah satunya:

$ sudo rm `git fsck --full 2>&1 | grep -oE -m 1 ".git/objects/[0-9a-f]{2}/[0-9a-f]*"`

  • 2>&1 mengalihkan pesan kesalahan ke stdout untuk dapat menerimanya
  • opsi grep yang digunakan:
    • -o hanya mengembalikan bagian dari garis yang benar-benar cocok
    • -E memungkinkan regex lanjutan
    • -m 1 pastikan hanya pertandingan pertama yang dikembalikan
    • [0-9a-f]{2} cocok dengan salah satu karakter antara 0 dan 9 dan a dan f jika dua dari mereka muncul bersamaan
    • [0-9a-f]* cocok dengan sejumlah karakter antara 0 dan 9 dan a dan f yang terjadi bersamaan

Itu masih hanya menghapus satu file pada satu waktu, jadi Anda mungkin ingin menyebutnya dalam satu lingkaran seperti:

$ while true; do sudo rm `git fsck --full 2>&1 | grep -oE -m 1 ".git/objects/[0-9a-f]{2}/[0-9a-f]*"`; done

Masalahnya adalah, ia tidak menghasilkan apa pun yang berguna lagi sehingga Anda tidak tahu kapan itu selesai (seharusnya tidak melakukan apa pun yang berguna setelah beberapa waktu)

Untuk "memperbaiki" ini saya kemudian hanya menambahkan panggilan git fsck --fullsetelah setiap putaran seperti: $ while true; do sudo rm `git fsck --full 2>&1 | grep -oE -m 1 ".git/objects/[0-9a-f]{2}/[0-9a-f]*"`; git fsck --full; done

Sekarang kira-kira setengah lebih cepat, tetapi memang outputnya "keadaan".

Setelah ini saya bermain-main dengan beberapa saran di utas ini dan akhirnya sampai pada titik di mana saya bisa git stashdan git stash dropbanyak hal yang rusak.

masalah pertama terpecahkan

Setelah itu saya masih memiliki masalah berikut: unable to resolve reference 'refs/remotes/origin/$branch': reference brokenyang dapat diselesaikan oleh $ rm \repo.git\refs\remotes\origin\$branch

$ git fetch

Saya kemudian melakukan $ git gc --prune=now

$ git remote prune origin

untuk ukuran yang baik dan

git reflog expire --stale-fix --all

untuk menyingkirkan error: HEAD: invalid reflog entry $blubbsaat berjalan git fsck --full.

memo42
sumber
2

Mari kita mulai .. hanya jika Anda mengunggah sumber ke repo git jarak jauh

  1. Cadangkan .git Anda
  2. periksa git Anda

    git fsck --full
    
  3. hapus file objek kosong (semua)

    rm .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e
    
  4. periksa git Anda lagi.

    git fsck --full
    
  5. tarik sumber Anda dari remote git

    git pull origin master
    
AXT.SIREN
sumber
2

Saya mengalami banyak masalah dengan mesin virtual.

Bagi saya karya-karya berikut:

cd /path/to/your/project
rm -rf .git

Jika Anda ingin menyimpan sendiri beberapa unduhan - buka penjelajah file Anda dan hapus semua file di folder yang sudah dikomit dan tinggalkan di folder / vendor dan / node_modules (saya bekerja dengan komposer dan npm).

maka cukup buat repo baru

git init

tambahkan kendali jarak jauh Anda

git remote add origin ssh://[email protected]/YourUsername/repoName.git

dan ambil cabang / semuanya

git fetch origin somebranch

dan memeriksanya

git checkout somebranch

maka Anda harus berada di titik sebelum kesalahan.

Semoga ini membantu.

Salam.

jermanDevelops
sumber
1

Saya mengalami masalah yang sama, dan saya menggunakan cara yang sangat sederhana untuk memperbaikinya. Saya menemukan bahwa file-file yang hilang ada di komputer teman satu tim saya.

Saya menyalin file-file itu satu per satu ke server git (total 9 file), dan itu memperbaiki masalahnya.

qiucw
sumber
1

Rekan-rekan saya dan saya telah beberapa kali menyeberang dengan masalah yang sama dan untuk menyelesaikannya kami cukup melakukan langkah-langkah yang saya jelaskan di bawah ini. Ini bukan solusi paling elegan yang dapat ditemukan tetapi bekerja tanpa kehilangan data.

  1. Ganti nama direktori kerja saat ini. ( old_projectuntuk contoh ini).
  2. Klon repositori dalam direktori baru menggunakan git clone.
  3. Pada baris perintah, ubah direktori kerja ke proyek yang baru dibuat dan alihkan ke cabang yang telah Anda kerjakan.
  4. Salin semua file dan direktori di dalam old_project(kecuali .gitdirektori) ke direktori proyek yang baru dibuat.
  5. Periksa status pohon kerja Anda (perhatikan bahwa ada banyak perubahan lebih dari yang Anda harapkan) dan kemudian lakukan perubahan.

Saya harap ini membantu ...

ymiraola
sumber
1

Berikut adalah cara untuk menyelesaikan masalah jika repo publik Anda di github.com berfungsi, tetapi repo lokal Anda rusak. Ketahuilah bahwa Anda akan kehilangan semua komitmen yang Anda lakukan di repo lokal.

Baiklah, jadi saya punya satu repo lokal yang memberi saya ini object empty error, dan repo yang sama di github.com, tetapi tanpa kesalahan ini. Jadi yang saya lakukan hanyalah mengkloning repo yang berfungsi dari github, dan kemudian menyalin semuanya dari repo yang korup (kecuali folder .git), dan menempelkannya repo kloning yang berfungsi.

Ini mungkin bukan solusi praktis (karena Anda menghapus komit lokal), namun, Anda mempertahankan kode dan kontrol versi yang diperbaiki.

Ingatlah untuk membuat cadangan sebelum menerapkan pendekatan ini.

Kode Realistis
sumber
1

Dalam kasus saya, tidak penting bagi saya untuk menyimpan riwayat commit lokal. Jadi jika itu juga berlaku untuk Anda, Anda dapat melakukan ini sebagai alternatif cepat untuk solusi di atas:

Anda pada dasarnya hanya mengganti .git/direktori yang rusak dengan yang bersih.

Mari kita asumsikan direktori berikut untuk proyek Anda dengan git yang rusak: projects/corrupt_git/

  1. cp projects/corrupt_git projects/backup - (opsional) buat cadangan
  2. git clone [repo URL] projects/clean_git - sehingga Anda dapatkan projects/clean_git
  3. rm -rf corrupt_git/.git/ - hapus folder .git yang rusak
  4. mv clean_git/.git/ corrupt_git/ - Pindahkan git bersih ke corrupt_git/.git
  5. git statusdi projects/corrupt_git- untuk memastikan itu berhasil
Benjamin Basmaci
sumber
0

Salin semuanya (dalam folder yang berisi .git) ke cadangan, lalu hapus semuanya dan mulai ulang. Pastikan Anda memiliki remote git:

git remote -v
 origin [email protected]:rwldrn/idiomatic.js.git (fetch)
 origin [email protected]:rwldrn/idiomatic.js.git (push)

Kemudian

mkdir mygitfolder.backup
cp mygitfolder/* mygitfolder.backup/
cd mygitfolder
rm -r * .git*
git init
git remote add origin [email protected]:rwldrn/idiomatic.js.git

Kemudian gabungkan semua file baru secara manual, dan coba nyalakan komputer Anda.

Shelvacu
sumber
rm -rf * mungkin memiliki konsekuensi yang sangat buruk. Apakah Anda benar-benar bersungguh-sungguh?
tommyk
@tommyk karenanya salin ke cadangan terlebih dahulu. Saya kira kekuatan itu tidak perlu.
Shelvacu
0

Punya masalah yang sama setelah memeriksa master dari cabang yang bersih. Setelah beberapa saat saya mengenali banyak file yang dimodifikasi di master. Saya tidak tahu mengapa mereka ada di sana, setelah beralih dari cabang yang bersih. Ngomong-ngomong, karena file yang dimodifikasi tidak masuk akal bagi saya, saya hanya menyimpannya dan kesalahan sudah hilang.

git:(master) git stash

memiliki sendiri
sumber
0

jika Anda memiliki cadangan LAMA dan sedang terburu-buru:

membuat CADANGAN BARU dari jalur proyek Anda saat ini, git-broken,.

  1. pindahkan Anda .gitke tempat sampah (tidak pernah dihapus)
  2. salin .gitdari cadangan TUA
  3. git pull (akan membuat konflik gabungan)
  4. pindahkan semua sumber Anda (semua yang Anda masukkan ke git) ke tempat sampah: ./src (tidak pernah dihapus)
  5. .copy semua sumber Anda (semua yang Anda masukkan ke git) dari CADANGAN BARU
  6. terima semua "gabungan" di git gui, dorong dan ... bertepuk tangan!
Aquarius Power
sumber
0

Solusi dua belas langkah yang dibahas di atas membantu saya keluar dari kemacetan juga. Terima kasih. Langkah-langkah kuncinya adalah memasukkan:

git fsck --full 

dan hapus semua benda kosong

rm .git/objects/...

Kemudian dapatkan dua garis belasan:

tail -n 2 .git/logs/refs/heads/master

Dengan nilai yang dikembalikan

git update-ref HEAD ...

Pada titik ini saya tidak memiliki kesalahan lagi, jadi saya membuat cadangan file terbaru saya. Kemudian lakukan git pull diikuti oleh git push. Menyalin cadangan saya ke file repositori git saya dan melakukan push git lainnya. Itu membuat saya lancar.

Yakub
sumber
0

Saya memperbaiki kesalahan git saya: file objek kosong oleh:

  1. Menyimpan salinan semua file yang saya edit sejak komitmen / push terakhir saya yang berhasil
  2. Menghapus dan mengkloning ulang repositori saya,
  3. Mengganti file lama dengan file saya yang diedit.

Semoga ini bisa membantu.

JattCode113
sumber
0

Ini juga terjadi pada saya hampir secara teratur. Belum membuat protokol saat ini terjadi persis, tetapi saya memiliki kecurigaan bahwa itu terjadi setiap kali mesin virtual saya ada "secara tak terduga". Jika saya menutup jendela VM (saya menggunakan Ubuntu 18.04) dan mulai lagi, semuanya selalu (?) Berfungsi. Tetapi jika jendela VM masih terbuka ketika laptop saya dimatikan (sistem host Windows), maka saya lebih sering mengalami masalah ini.

Adapun semua jawaban yang diberikan di sini:

  1. terima kasih - mereka sangat berguna; Saya biasanya menyimpan salinan lokal kode saya, mengembalikan repo dari jarak jauh, dan memindahkan salinan cadangan ke folder lokal.

  2. karena masalah yang mendasarinya bukan masalah git, tapi masalah VM dan / atau Linux, saya bertanya-tanya apakah seharusnya tidak ada cara untuk menyembuhkan alasannya daripada gejalanya? Bukankah kesalahan semacam ini menunjukkan bahwa beberapa perubahan sistem file tidak "diterapkan" pada waktu yang wajar, tetapi hanya di-cache? (lihat misalnya /unix/464184/are-file-edits-in-linux-directly-saved-into-disk ) - bagi saya sepertinya mesin virtual Linux tidak fsynch barang-barang mereka cukup sering. Apakah ini masalah Oracle VirtualBox (yang jika tidak berfungsi dengan sangat baik) atau sistem file tamu, atau beberapa pengaturan, yang kita semua abaikan, berada di luar keahlian saya. Tetapi saya akan senang jika seseorang dapat menjelaskan hal ini.

Maschu
sumber
0

Sebenarnya saya punya masalah yang sama. Dapatkan salinan kode Anda sebelum mencoba ini.

saya baru saja melakukannya git reset HEAD~

komit terakhir saya dibatalkan lalu saya komit lagi, masalah terpecahkan!

k441i
sumber
-5

Peringatan: Dengan lebih banyak pengalaman, saya menyadari bahwa ini adalah opsi nuklir dan biasanya tidak boleh dilakukan dan tidak mengajarkan apa pun. Namun, pada kesempatan yang jarang terjadi untuk proyek pribadi, saya masih menganggapnya berguna, jadi saya meninggalkannya.

Jika Anda tidak peduli tentang menjaga komitmen historis Anda, jalankan saja

rm -r .git

Kemudian jawab ya untuk pertanyaan apa pun tentang menghapus file yang dilindungi tulis. Masalah terpecahkan dalam waktu kurang dari satu menit.

Memang
sumber
3
Jangan lakukan ini jika Anda ingin sejarah Anda berlaku.
mu 無