Selama klon pertama repositori, git pertama menerima objek (yang cukup jelas), dan kemudian menghabiskan waktu yang sama untuk "menyelesaikan delta". Apa yang sebenarnya terjadi selama fase kloning ini?
Selama klon pertama repositori, git pertama menerima objek (yang cukup jelas), dan kemudian menghabiskan waktu yang sama untuk "menyelesaikan delta". Apa yang sebenarnya terjadi selama fase kloning ini?
Jawaban:
Git menggunakan delta encoding untuk menyimpan beberapa objek dalam paket file. Namun, Anda tidak ingin harus bermain kembali setiap perubahan tunggal yang pernah pada file yang diberikan untuk mendapatkan versi saat ini, sehingga Git juga memiliki snapshot sesekali isi file yang disimpan juga. "Menyelesaikan delta" adalah langkah yang berhubungan dengan memastikan semua itu tetap konsisten.
Inilah bab dari bagian "Git Internal" dari buku Pro Git, yang tersedia online, yang membahas tentang ini.
git gcatau kapan pun Git menentukannya perlu) Git akan mengompres semua file "longgar" ke dalam paketfile untuk menghemat ruang dan file indeks ke dalam paketf tersebut akan dibuat. Jadi zlib akan mengompres dengan algoritma delta sendiri tetapi Git menggunakan delta-encoding untuk menyimpan versi sebelumnya. Karena akses yang paling umum dan sering adalah versi terbaru, itu disimpan sebagai snapshot.
Tahapannya git cloneadalah:
"Resolving delta" adalah pesan yang ditunjukkan untuk tahap kedua, mengindeks file paket ("git index-pack").
File paket tidak memiliki ID objek aktual di dalamnya, hanya konten objek. Jadi untuk menentukan apa ID objek, git harus melakukan dekompresi + SHA1 dari setiap objek dalam paket untuk menghasilkan ID objek, yang kemudian ditulis ke dalam file indeks.
Objek dalam file paket dapat disimpan sebagai delta yaitu urutan perubahan yang dibuat ke beberapa objek lain. Dalam hal ini, git perlu mengambil objek dasar, menerapkan perintah dan SHA1 hasilnya. Objek dasar itu sendiri mungkin harus diturunkan dengan menerapkan urutan perintah delta. (Meskipun dalam kasus kloning, objek dasar sudah akan ditemui, ada batas berapa banyak objek yang diproduksi di-cache dalam memori).
Singkatnya, tahap "menyelesaikan delta" melibatkan dekompresi dan checksumming seluruh database repo, yang tidak mengejutkan membutuhkan waktu yang cukup lama. Agaknya dekompresi dan penghitungan SHA1 sebenarnya membutuhkan lebih banyak waktu daripada menerapkan perintah delta.
Dalam kasus pengambilan berikutnya, file paket yang diterima dapat berisi referensi (sebagai basis objek delta) ke objek lain yang diharapkan sudah dimiliki oleh git penerima. Dalam hal ini, git penerima sebenarnya menulis ulang file paket yang diterima untuk menyertakan objek yang direferensikan tersebut, sehingga setiap file paket yang disimpan cukup mandiri. Di sinilah pesan "resolta delta" berasal.
Amber tampaknya menggambarkan model objek yang Mercurial atau gunakan serupa. Git tidak menyimpan delta di antara versi berikutnya dari suatu objek, melainkan snapshot objek yang penuh, setiap saat. Ini kemudian mengkompresi snapshot ini menggunakan kompresi delta, mencoba mencari delta yang baik untuk digunakan, terlepas dari mana dalam sejarah ini ada.