Coba perintah berikut pada awalnya (jalankan kembali jika perlu):
$ git fsck --full
$ git gc
$ git gc --prune=today
$ git fetch --all
$ git pull --rebase
Dan kemudian Anda masih memiliki masalah, coba dapat:
hapus semua objek yang rusak, mis
fatal: loose object 91c5...51e5 (stored in .git/objects/06/91c5...51e5) is corrupt
$ rm -v .git/objects/06/91c5...51e5
singkirkan semua benda kosong, mis
error: object file .git/objects/06/91c5...51e5 is empty
$ find .git/objects/ -size 0 -exec rm -vf "{}" \;
periksa pesan "tautan rusak" dengan:
git ls-tree 2d9263c6d23595e7cb2a21e5ebbb53655278dff8
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:
git hash-object -w my-magic-file
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:
git log --raw --all --full-history -- subdirectory/my-magic-file
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:
$ git for-each-ref --format='%(refname)' | while read ref; do git rev-list --objects $ref >/dev/null || echo "in $ref"; done
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:
$ (echo HEAD; git for-each-ref --format='%(refname)') | while read ref; do git rev-list -g --objects $ref >/dev/null || echo "in $ref"; done
(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:
$ git pull --rebase
Anda juga dapat mencoba untuk membayar cabang baru dan menghapus yang lama:
$ git checkout -b new_master origin/master
Untuk menemukan objek yang rusak di git untuk dihapus, coba perintah berikut:
while [ true ]; do f=`git fsck --full 2>&1|awk '{print $3}'|sed -r 's/(^..)(.*)/objects\/\1\/\2/'`; if [ ! -f "$f" ]; then break; fi; echo delete $f; rm -f "$f"; done
Untuk OSX, gunakan sed -E
bukan sed -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:
$ cp -fr .git/objects/pack .git/objects/pack.bak
$ for i in .git/objects/pack.bak/*.pack; do git unpack-objects -r < $i; done
$ rm -frv .git/objects/pack.bak
Jika di atas tidak membantu, Anda dapat mencoba untuk rsync atau menyalin objek git dari repo lain, mis
$ rsync -varu git_server:/path/to/git/.git local_git_repo/
$ rsync -varu /local/path/to/other-working/git/.git local_git_repo/
$ cp -frv ../other_repo/.git/objects .git/objects
Untuk memperbaiki cabang yang rusak saat mencoba melakukan pembayaran sebagai berikut:
$ git checkout -f master
fatal: unable to read tree 5ace24d474a9535ddd5e6a6c6a1ef480aecf2625
Coba hapus dan lakukan pembayaran dari upstream lagi:
$ git branch -D master
$ git checkout -b master github/master
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:
$ git reset HEAD --hard
$ git rebase -s recursive -X theirs origin/master
Lihat juga:
.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.