Anda harus dapat memulihkan file apa pun yang Anda tambahkan ke indeks (misalnya, seperti dalam situasi Anda, dengan git add .
) meskipun ini mungkin sedikit berhasil. Untuk menambahkan file ke indeks, git menambahkannya ke database objek, yang berarti file tersebut dapat dipulihkan selama pengumpulan sampah belum terjadi. Ada contoh bagaimana melakukan ini diberikan dalam jawaban Jakub Narębski di sini:
Namun, saya mencobanya pada repositori percobaan, dan ada beberapa masalah - --cached
seharusnya --cache
, dan saya menemukan bahwa itu tidak benar-benar membuat .git/lost-found
direktori. Namun, langkah-langkah berikut berhasil untuk saya:
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)")
Itu harus mengeluarkan semua objek dalam database objek yang tidak dapat dijangkau oleh referensi mana pun, dalam indeks, atau melalui reflog. Outputnya akan terlihat seperti ini:
unreachable blob 907b308167f0880fb2a5c0e1614bb0c7620f9dc3
unreachable blob 72663d3adcf67548b9e0f0b2eeef62bce3d53e03
... dan untuk setiap gumpalan tersebut, Anda dapat melakukan:
git show 907b308
Untuk mengeluarkan isi file.
Output terlalu banyak?
Update dalam menanggapi sehe 's komentar di bawah ini:
Jika Anda menemukan bahwa Anda memiliki banyak komit dan struktur yang terdaftar dalam output dari perintah itu, Anda mungkin ingin menghapus dari output objek apapun yang direferensikan dari komit yang tidak direferensikan. (Biasanya Anda dapat kembali ke komit ini melalui reflog - kami hanya tertarik pada objek yang telah ditambahkan ke indeks tetapi tidak pernah dapat ditemukan melalui komit.)
Pertama, simpan output dari perintah tersebut, dengan:
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") > all
Sekarang nama objek dari komit yang tidak dapat dijangkau itu dapat ditemukan dengan:
egrep commit all | cut -d ' ' -f 3
Jadi Anda bisa menemukan pohon dan objek yang telah ditambahkan ke indeks, tetapi tidak dikomit pada titik mana pun, dengan:
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") \
$(egrep commit all | cut -d ' ' -f 3)
Itu sangat mengurangi jumlah objek yang harus Anda pertimbangkan.
Pembaruan: Philip Oakley di bawah ini menyarankan cara lain untuk mengurangi jumlah objek yang perlu dipertimbangkan, yaitu dengan hanya mempertimbangkan file yang paling baru diubah di bawah .git/objects
. Anda dapat menemukannya dengan:
find .git/objects/ -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort
(Saya menemukan find
doa itu di sini .) Akhir dari daftar itu mungkin terlihat seperti:
2011-08-22 11:43:43.0234896770 .git/objects/b2/1700b09c0bc0fc848f67dd751a9e4ea5b4133b
2011-09-13 07:36:37.5868133260 .git/objects/de/629830603289ef159268f443da79968360913a
Dalam hal ini Anda dapat melihat objek tersebut dengan:
git show b21700b09c0bc0fc848f67dd751a9e4ea5b4133b
git show de629830603289ef159268f443da79968360913a
(Perhatikan bahwa Anda harus menghapus /
di ujung jalur untuk mendapatkan nama objek.)