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.
Jawaban:
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.sumber
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.
sumber