Bir deponun ilk klonu sırasında git önce nesneleri alır (yeterince açıktır) ve sonra aynı miktarda "deltaları çözümlemek" için harcar. Aslında klonun bu aşamasında neler oluyor?
Bir deponun ilk klonu sırasında git önce nesneleri alır (yeterince açıktır) ve sonra aynı miktarda "deltaları çözümlemek" için harcar. Aslında klonun bu aşamasında neler oluyor?
Yanıtlar:
Git, bazı nesneleri paket dosyalarında saklamak için delta kodlaması kullanır . Ancak, her değişikliği oynatmak zorunda kalmak istemiyoruz hiç Git ayrıca sıra saklanan dosya içeriğinin ara sıra anlık sahiptir, böylece güncel sürümünü almak için belirli bir dosya üzerinde. "Deltaları çözümlemek", tüm bunların tutarlı kalmasını sağlamakla ilgili adımdır.
İşte Pro Git kitabının çevrimiçi olarak sunulan "Git Internals" bölümünden bu konuyu anlatan bir bölüm .
git gcveya Git ne zaman gerekli olduğunu belirlediğinde) Git, yer kazanmak için tüm "gevşek" dosyaları bir paket dosyasına sıkıştırır ve bu paket dosyasına bir dizin dosyası oluşturulur. Dolayısıyla zlib kendi delta algoritmasıyla sıkıştırır, ancak Git önceki sürümleri saklamak için delta kodlaması kullanır. En yaygın ve sık erişim en son sürüm olduğundan, anlık görüntü olarak saklanır.
Aşamaları git clone:
"Deltaların çözümlenmesi", paket dosyasını ("git index-pack") endeksleyen ikinci aşama için gösterilen mesajdır.
Paketi dosyaları yok değil onları gerçek nesne kimlikleri, yalnızca nesne içeriğe sahip. Bu nedenle nesne kimliklerinin ne olduğunu belirlemek için git paketindeki her nesnenin bir sıkıştırmasını + SHA1 yapmak zorundadır, bu nesne daha sonra indeks dosyasına yazılır.
Bir paket dosyasındaki bir nesne delta olarak saklanabilir, yani başka bir nesnede yapılacak değişiklik dizisi. Bu durumda, git temel nesneyi almak, komutları uygulamak ve sonucu SHA1 gerekir. Temel nesnenin kendisinin bir dizi delta komutu uygulanarak türetilmesi gerekebilir. (Bir klon söz konusu olduğunda, temel nesneye zaten rastlanmış olsa da, bellekte üretilen kaç nesnenin önbelleğe alınmasının bir sınırı vardır).
Özetle, "deltaların çözümlenmesi" aşaması, şaşırtıcı bir şekilde oldukça uzun sürmeyen tüm repo veritabanının sıkıştırmasının kaldırılmasını ve denetlenmesini içerir. Büyük olasılıkla SHA1'lerin sıkıştırmasını açmak ve hesaplamak aslında delta komutlarını uygulamaktan daha fazla zaman alır.
Sonraki bir getirme durumunda, alınan paket dosyası, alıcı git'in zaten sahip olması beklenen diğer nesnelere referanslar (delta nesnesi temelleri olarak) içerebilir. Bu durumda, alıcı git, alınan paket dosyasını, bu tür başvurulan nesneleri içerecek şekilde yeniden yazar, böylece depolanan herhangi bir paket dosyası kendi kendine yeterli olur. Burası "deltaları çözümlemek" mesajının kaynaklandığı yer olabilir.
Amber, Mercurial veya benzerlerinin kullandığı nesne modelini tarif ediyor gibi görünüyor. Git, bir nesneyi sonraki sürümleri arasında deltaları değil, her seferinde nesnenin tam anlık görüntülerini saklar. Daha sonra bu anlık görüntüleri delta sıkıştırma kullanarak sıkıştırır, geçmişte nerede olursa olsun, kullanılacak iyi deltaları bulmaya çalışır.