Seberapa kuat yang dilakukan Git saat daya padam?

24

Suatu hari saya menggunakan Git (saya masih menggunakannya) dan listrik mati ketika saya sedang melakukan.

Ketika saya (sebenarnya, listrik) kembali, repo git rusak. Saya tidak ingat nama persisnya, tapi itu sesuatu seperti "referensi tidak valid" atau sesuatu seperti itu.

Sangat mudah untuk menebak bahwa komit rusak di tengah operasi (saya melakukan melalui IntelliJ, yang melakukan penambahan indeks secara otomatis). Mudah juga untuk menebak bahwa, sebenarnya, 'komit' tidak sama ACID dengan operasi DBMS dengan nama yang sama.

T : Apakah ada cara untuk memastikan operasi repo yang menghormati atomicity? yaitu jika listrik padam lagi, dan saya melakukan, saya ingin filesystem saya tidak dalam keadaan korup.

Luis Masuelli
sumber
10
Beli UPS? .....
Robert Harvey
membuat cadangan harian?
ratchet freak
Itu tidak menyelesaikan masalah - bayangkan git repo ada di server dan saya PUSH dari repo lokal, dan sementara asimilasi komit di server, energinya turun lagi. Masalah yang sama tetapi kali ini tanpa kehadiran manusia.
Luis Masuelli

Jawaban:

10

Saya tidak tahu apakah ada cara untuk membuat Git komit selamat dari kegagalan daya dengan waktu yang tepat, tetapi Anda mungkin dapat memperbaiki repositori Anda.

Objek Git seharusnya tidak berubah, jadi semua komitmen lama Anda masih harus valid. Menurut jawaban ini , Anda dapat mengubah hash .git/refs/heads/<branch-name>untuk mengubah kepala cabang yang Anda kerjakan ke komit sebelumnya (Anda dapat melihatnya di .git/logs/HEAD).

Komentar untuk jawaban itu mengatakan bahwa metode ini "Masih meninggalkan repositori dalam keadaan rusak, tetapi ini memungkinkan untuk memulihkannya". Saya tidak menguji ini (tidak tahu bagaimana meniru situasi Anda), tetapi saya menganggap pemulihan dilakukan melalui git gc, yang akan menghapus komit yang rusak.

Idan Arye
sumber
6
"tidak tahu bagaimana meniru situasi Anda" Cabut steker? ;)
yannis
3
@YannisRizos Mungkin jika ini adalah SVN, tetapi Git melakukan terlalu cepat untuk kemampuan pengaturan waktu manusia ...
Idan Arye
5
Git adalah open source, kan? Jadi untuk mereproduksi masalah, buat kode, atur breakpoint sebelum data disimpan ke disk - dan kemudian tarik steker.
John Saunders
10

Sistem penyimpanan Git tidak bersifat transaksional, jadi pasti ada kemungkinan masalah perangkat keras dapat menyebabkan keadaan menjadi tidak konsisten. Di sisi lain, Git juga sangat cepat sehingga Anda harus benar-benar beruntung terkena masalah jenis "kegagalan daya" (masalah sistematis dengan disk adalah hal lain). Kecepatan datang sebagian tepatnya dari fakta bahwa itu bukan transaksional; transaksi benar-benar sangat mahal karena mereka harus menunggu konfirmasi kembali dari disk yang telah menulis data. (Basis data melakukan segala hal untuk menyembunyikan biaya ini, tetapi pada akhirnya mereka tetap membayar harganya. Beberapa pesaing DVCSes bersifat transaksional, dan ya, mereka agak lebih lambat pada perangkat keras yang sama dengan git.)

Dalam kasus terburuk - total kegagalan disk bencana (yang pernah saya lihat terjadi) - satu-satunya cara untuk memulihkan DVCS adalah dengan menggunakan fakta bahwa itu didistribusikan. Jika Anda telah mendorong perubahan Anda hingga baru-baru ini ke sistem lain dan mereka telah membagikannya ke banyak host yang berbeda, pemulihan hanyalah masalah menggunakan salah satu dari tempat-tempat lain ini sebagai sumber artefak, tempat untuk menarik cabang Anda dari ( bahkan jika hanya sementara). Seperti itu, Anda akan menarik kembali sejarah cabang-cabang yang menarik dan Anda akan dapat bekerja kembali dengan sangat cepat; apa pun yang menghapus banyak salinan repo Anda sekaligus adalah bencana dari jenis di mana Anda tidak khawatir tentang pemrograman sesudahnya (pikirkan dampak meteorit utama) atau tindakan musuh langsung. (Cobalah untuk tidak membuat musuh seperti itu ...) Ini sangat kontras dengan sistem yang tidak terdistribusi, di mana kehilangan server pusat yang menampung semuanya adalah pukulan fatal.

Donal Fellows
sumber
5
Jika Anda tidak mendorong cabang Anda, jangan menyimpan cadangan dan jangan UPS, Anda hanya bisa menyalahkan diri sendiri jika masalah perangkat keras menghapus semuanya. Anda sudah punya alatnya ...
Donal Fellows
1
Apakah tidak ada cara atau plugin untuk memastikan operasi git bersifat transaksional? Jika opsi semacam itu - atau plugin - ada, saya tidak akan peduli bahwa mereka (yaitu operasi) lebih lambat. Untungnya saya tidak memiliki masalah perangkat keras. Sayangnya energi sering padam (mengatakan sekali per dua minggu mendapatkan kehadirannya sendiri) di gedung ini, dan saya coding sepanjang waktu dan belum UPS. Untungnya saya remotes (kloning / dorong) ke github. Sayangnya saya kehilangan waktu ketika harus mengembalikan semuanya dan mereplikasi proyek lagi.
Luis Masuelli
2
Pemadaman listrik yang sering saat bekerja berarti Anda benar-benar meningkatkan risiko korupsi sistem file, jika tidak merusak perangkat keras. Saya ingin tahu mengapa Anda tidak menyukai gagasan mendapatkan UPS, yang akan menyelesaikan sebagian besar masalah yang Anda alami dan mungkin akan menjadi jawaban terbaik.
Bart Silverstrim