𝗠𝗲𝗺𝗯𝗶𝗻𝗮 𝗞𝗮𝘄𝗮𝗹𝗮𝗻 𝗩𝗲𝗿𝘀𝗶 𝘆𝗮𝗻𝗴 𝗖𝗲𝗸𝗮𝗽 𝗧𝗮𝗻𝗽𝗮 𝗠𝗲𝗻𝗱𝘂𝗽𝗹𝗶𝗸𝗮𝘀𝗶 𝗙𝗮𝗶𝗹
Menyimpan salinan penuh fail bagi setiap versi atau fork membazirkan ruang. Jika anda mengubah satu baris dalam projek yang mempunyai sepuluh fail, anda tidak sepatutnya menyimpan kesemua sepuluh fail itu semula.
Saya menghadapi masalah ini semasa membina projek LaTeX Writer saya. Saya memerlukan cara untuk mengendalikan kawalan versi dan forking projek tanpa kos storan yang tinggi.
Saya melihat bagaimana GitHub berfungsi. GitHub tidak menyimpan repositori penuh setiap kali anda membuat perubahan. Ia menyimpan kandungan secara berasingan dan menggunakan rujukan untuk menghubungkan fail dan commit.
Saya membina sistem saya menggunakan tiga komponen utama:
- Metadata: Ini menyimpan ID untuk projek, pemilik, dan folder.
- Rekod Fail: Ini menyimpan nama fail dan pautan ke kandungan.
- Blobs: Di sinilah kandungan sebenar disimpan.
Sistem ini berfungsi melalui content hashing. Apabila anda menyimpan fail, sistem akan menjana ID unik berdasarkan kandungan tersebut. Jika kandungan itu sudah wujud, sistem akan menggunakan semula Blob yang sedia ada. Ia tidak akan mencipta yang baharu.
Pendekatan ini menjadikan forking mudah dan murah. Apabila anda melakukan fork pada sesuatu projek:
- Sistem mencipta ID Projek baharu.
- Ia mencipta metadata baharu untuk fail dan folder.
- Ia menghalakan metadata baharu tersebut ke Blob yang sedia ada.
Tiada kandungan fail sebenar disalin semasa fork. Anda hanya menduplikasi rekod metadata yang kecil.
Apabila anda menyunting fork, proses tersebut kekal cekap:
- Anda mengubah kandungan.
- Sistem melakukan hashing pada kandungan baharu.
- Ia mencipta Blob baharu hanya jika kandungan yang tepat itu belum wujud.
- Metadata untuk fork anda menghala ke Blob baharu.
- Projek asal masih menghala ke Blob lama.
Kaedah ini memberikan beberapa kelebihan:
- Penyahduplikasian kandungan (content deduplication) menjimatkan ruang yang sangat besar.
- Forking berlaku secara serta-merta.
- Pengurusan versi kekal teratur.
- Pertumbuhan pangkalan data kekal perlahan.
Anda mendapat fungsi seperti GitHub tanpa bebanan storan yang berat.