Saya merasa seperti anak kecil di kantor kepala sekolah yang menjelaskan bahwa anjing itu memakan pekerjaan rumah saya pada malam sebelum waktunya, tetapi saya memandangi beberapa bug kehilangan data gila di wajah dan saya tidak tahu bagaimana hal itu terjadi. Saya ingin tahu bagaimana git bisa memakan seluruh repositori saya! Saya telah memasukkan git melalui alat pemeras berkali-kali dan tidak pernah berkedip. Saya telah menggunakannya untuk membagi repo Subversion 20 Gig menjadi repo 27 git dan menyaring foo keluar dari mereka untuk mengurai kekacauan dan tidak pernah kehilangan satu byte pada saya. Reflog selalu ada untuk digunakan kembali. Kali ini karpetnya hilang!
Dari sudut pandang saya, yang saya lakukan hanyalah menjalankan git pull
dan menghapus seluruh repositori lokal saya. Saya tidak bermaksud itu "mengacaukan versi check out" atau "cabang tempat saya berada" atau semacamnya. Maksudku semuanya hilang .
Berikut adalah cuplikan layar terminal saya saat kejadian:
Biarkan saya memandu Anda melalui itu. Command prompt saya menyertakan data tentang repo git saat ini (menggunakan implementasi vcs_info prezto) sehingga Anda dapat melihat kapan repo git menghilang. Perintah pertama cukup normal:
» caleb » jaguar » ~/p/w/incil.info » ◼ zend ★ »
❯❯❯ git co master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
Di sana Anda dapat melihat saya berada di cabang 'zend', dan memeriksa master. Sejauh ini bagus. Anda akan melihat pada prompt sebelum perintah saya berikutnya bahwa ia berhasil mengganti cabang:
» caleb » jaguar » ~/p/w/incil.info » ◼ master ★ »
❯❯❯ git pull
remote: Counting objects: 37, done.
remote: Compressing objects: 100% (37/37), done.
remote: Total 37 (delta 25), reused 0 (delta 0)
Unpacking objects: 100% (37/37), done.
From gitlab.alerque.com:ipk/incil.info
+ 7412a21...eca4d26 master -> origin/master (forced update)
f03fa5d..c8ea00b devel -> origin/devel
+ 2af282c...009b8ec verse-spinner -> origin/verse-spinner (forced update)
First, rewinding head to replay your work on top of it...
>>> elapsed time 11s
Dan begitu saja itu hilang. Marker waktu yang telah berlalu menampilkan sebelum prompt berikutnya jika lebih dari 10 detik telah berlalu. Git tidak memberikan output apa pun di luar pemberitahuan bahwa ia memutar ulang untuk diputar ulang. Tidak ada indikasi bahwa itu selesai.
Prompt berikutnya tidak menyertakan data tentang cabang apa yang kita gunakan atau status git.
Tidak menyadari bahwa itu telah gagal, saya dengan tidak sengaja mencoba menjalankan perintah git yang lain hanya untuk diberi tahu bahwa saya tidak berada dalam git repo. Perhatikan PWD tidak berubah:
» caleb » jaguar » ~/p/w/incil.info »
❯❯❯ git fetch --all
fatal: Not a git repository (or any parent up to mount point /home)
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
Setelah ini melihat-lihat menunjukkan bahwa saya berada di direktori yang benar-benar kosong. Tidak ada. Tidak ada direktori '.git', tidak ada. Kosong.
Git lokal saya ada di versi 2.0.2. Berikut adalah beberapa berita dari konfigurasi git saya yang mungkin relevan untuk mengetahui apa yang terjadi:
[branch]
autosetuprebase = always
rebase = preserve
[pull]
rebase = true
[rebase]
autosquash = true
autostash = true
[alias]
co = checkout
Sebagai contoh saya telah git pull
menetapkan untuk selalu melakukan rebase bukan penggabungan, sehingga bagian dari output di atas normal.
Saya dapat memulihkan data. Saya tidak berpikir ada objek git selain beberapa simpanan tidak penting yang belum didorong ke repo lain, tapi saya ingin tahu apa yang terjadi .
Saya telah memeriksa untuk:
- Pesan di dmesg atau jurnal systemd. Tidak ada yang bahkan relevan.
- Tidak ada indikasi kegagalan drive atau sistem file (LVM + LUKS + EXT4 semuanya terlihat normal). Tidak ada yang hilang + ditemukan.
- Saya tidak menjalankan apa pun. Tidak ada dalam sejarah saya tidak menunjukkan di atas, dan tidak ada terminal lain yang digunakan selama waktu ini. Tidak ada
rm
perintah yang beredar yang mungkin telah dieksekusi di CWD yang salah, dll. - Mengolok-olok repo git lain di direktori lain tidak menunjukkan kelainan nyata
git pull
s.
Apa lagi yang harus saya cari di sini?
sumber
.git
tidak tidak ada. Tidak ada yang berhasil — apa yang dulunya adalah direktori git root tidak memiliki apa-apa di dalamnya.Jawaban:
Ya,
git
makan pekerjaan rumah saya. Semua itu.Saya membuat
dd
gambar disk ini setelah kejadian dan mengacaukannya nanti. Merekonstruksi serangkaian acara dari log sistem, saya menyimpulkan apa yang terjadi adalah sesuatu seperti ini:pacman -Syu
) telah dikeluarkan beberapa hari sebelum kejadian ini.git checkout
dan sebelumgit pull
.git
biner harus digantikan setelahgit pull
dimulai dan sebelum selesai.git
beristirahat dari semua pekerjaannya. Dan menghapus dunia sehingga semua orang harus beristirahat juga.Saya tidak tahu persis kondisi ras apa yang menyebabkan ini terjadi, tetapi menukar binari di tengah operasi tentu saja tidak baik atau kondisi yang dapat diuji / diulang. Biasanya salinan biner yang berjalan disimpan dalam memori, tetapi
git
aneh dan sesuatu tentang cara itu menumbuhkan kembali versi itu sendiri, saya yakin menyebabkan kekacauan ini. Jelas itu seharusnya mati daripada menghancurkan segalanya, tapi itulah yang terjadi.sumber
git-fetch
,git-rebase
ataugit-merge
dangit gc
Mungkin dengan gagal mendefinisikan path file yang akan dihapus.
Kasing Anda mengingatkan saya pada hari yang indah bahwa ketika
remove(path)
metode buatan saya mencoba menghapus folder root karena parameter yang diberikan adalah string kosong yang dikoreksi oleh OS (!) Sebagai folder root.Ini mungkin bug git yang serupa. Seperti yang:
remove(project_folder + file_path)
(kode semu)file_path
itu kosong.remove(project_folder)
sumber
Dengan sedikit keberuntungan, Anda dapat memperbaikinya dengan perintah berikut:
Ketika potensi perubahan berbahaya dimulai, git menyembunyikan status Anda saat ini di ORIG_HEAD. Dengan itu Anda dapat membatalkan gabungan atau rebase.
Manual Git: Membatalkan Penggabungan
sumber
Sepertinya seseorang menjalankan
git push --force
repo ini, dan Anda menarik perubahan itu. Coba kloning repo segar, yang seharusnya membuat Anda kembali ke kondisi kerja bersih lagi.sumber
.git
direktori someones dengan dorongan paksa