Git / Mercurial depoları neden daha az yer kullanıyor?


15

Burada ve SO üzerinde DVCS depolarının merkezileştirilmiş karşı parçalarından yaklaşık olarak aynı veya daha az alan kullandığını birkaç tartışmada okudum. Kaçırmış olabilirim, ama bunun nedeninin iyi bir açıklamasını bulamadım. Kimse biliyor mu?



1
Yapmadım, teşekkürler! Bu yüzden iki cevap olduğunu anlıyorum: zlib kullanarak sıkıştırma ve mümkün olduğunda nesneleri packfiles olarak kaydetme. Mozilla'dan örnekler de harika!
Alex Florescu

1
@Alex Hayır, ana nedeni kaçırıyor. SVN eksiksiz görüntüler kaydeder, Git ve Mercurial sadece HEAD revizyonunu ve farklarını kaydeder. Geleneksel sıkıştırmayı kullanmak size yaklaşık% 60-80 oranında sıkıştırma için en iyi oranları sağlayabilir. Diffs kullanmak size% 99'a kadar verebilir. Ancak bu sayılar kıçımdan çekiliyor - gerçek sayılar farklı olabilir; bu eğilim aynı olacaktır.
Konrad Rudolph

@KonradRudolph, paket dosyalarının hepsi bu değil mi?
Alex Florescu

@Alex Pek değil. Bildiğim kadarıyla packfile ek olarak birden fazla dosyayı bir pakete paketliyor . Bu ille de ilişkili değildir.
Konrad Rudolph

Yanıtlar:


18

Kendi deneyimlerime göre, aşağıdaki ifadelerin hepsi doğrudur:

  • Git, metin dosyalarını ve yalnızca değiştirilen bu dosyaları depolamakta çok etkilidir. bu nedenle depo boyutlarını karşılaştırmak için SVN ve Git karşılaştırması yaparken bunlar benzer olabilir veya Git için küçük bir avantaj bile olabilir.
  • Önemli miktarda dosyanın ofis dosyası olduğu (MS word, excel, powerpoint, ... gibi) depoların boyutunu karşılaştırırsanız bu tamamen yanlıştır. Burada Git tam kopyaları da saklar, yani bir powerpoint slayt yığınındaki 10 küçük değişiklik 10 tam kopyayla sonuçlanır, burada Subversion sadece 100 daha küçük bir faktör olabilecek bir ikili fark depolar.

Ödeme konumunu (kendi içinde bir depo olan Git ile) karşılaştırırsanız, hikaye tamamen farklıdır:

  • Subversion, her dosya için tam bir kopya saklar, böylece ödeme konumunuzun boyutu normalde dosyaların kendisinin 2 katıdır.
  • Git, deponun tüm geçmişini yerel olarak depolar, bu nedenle geçmişin boyutuna bağlı olarak, bu, Subversion ödeme kopyasından daha küçük veya çok daha büyük olabilir.

İndirmeniz veya yüklemeniz gereken bayt miktarını karşılaştırırsanız, yine farklıdır.

  • Subversion normalde daha az bayt göndermeli veya almalıdır, çünkü yalnızca farklılıklar gönderir. Bunu her taahhüt ve güncellemede yapmak zorundadır.
  • Git tüm deposu (başlangıçta) almalı ve sonra metin dosyaları için farklı olmayan, ancak ikili dosyalar için farklı olabilecek tam dosyaları (sıkıştırılmış?) Gönderir. Ve evet, Git bunu yalnızca uzak depoya bir şey ittiğinizde veya çektiğinizde yapar.

Sonuçta, elmaları portakallarla karşılaştırıyorsunuz ve Subversion veya Git ile ne yapmak istediğinize bağlı olarak sonuç farklı olabilir.


@jk tam kopyaları veya ikili diffs'leri sordu ve bu soruya cevap veremedim. Son zamanlarda Jax 2012'de (ziyaret ettiğim) bir Git atölyesi veren Matthew McCullough'a sordum. Git'in iç çalışmasını detaylı bir şekilde açıklamak için zaman ayırdı (ona çok teşekkür ediyor) . Yani evet, orada çalışan bir sıkıştırma var (ve ben de bir microsoft ofis dosyası ile bir deney yapacağım ve bunu özü ile karşılaştıracağım), ama hayır, sıkıştırma tüm dosya üzerinde yapılır. Özünden alıntı:

Gevşek nesneler, her işlem sırasında sıkıştırılmış, ancak delta olmayan biçimde yazılır.


1
git'in office dosyalarının tam kopyalarını sakladığından emin misiniz? Bence ikili diffs de saklıyor. Tabii ki bu tür dosyalarla ilgili asıl sorun genellikle sıkıştırılmış olmalarıdır, bu nedenle küçük bir değişiklik tüm dosyanın değişmesine neden olabilir
jk.

2
Benden daha fazlasını bilen ve cevabına cevabımı ekleyecek birine (e-posta ile) sordu.
mliebelt

6
Git, metin ve ikili dosyaları depolamaya ilişkin her şekilde ve aynı şekilde ele alır. Gevşek ve paketlenmiş nesneler metinle ikili arasındaki ilişkisizdir. İkili dosyaların genellikle metin dosyalarından çok daha büyük farklara neden olmasının nedeni, birçok ikili biçimin (tüm yeni ofis biçimleri dahil) zaten sıkıştırılmış olmasıdır ve bu nedenle içerikteki küçük bir değişiklik bile sonuçta ortaya çıkan ikili blobda büyük değişikliğe neden olur. Bu, git ve yıkım için aynı derecede endişe vericidir, ancak yıkım sadece sunucudaki cezayı alırken, her yere git.
Jan Hudec

4
Gevşek ve paketlenmiş nesnelerin metinle ikili arasındaki hiçbir ilgisi yoktur. İkili fark bulma zor işinin itfa edilmesidir. Hız git'in önemli bir özelliğidir, bu nedenle düzenli çalışma sırasında git sadece yeni verileri fermuarlar ve depoya tokatlar. Bu gevşek nesneler. Bunu arayarak git gcveya çok fazla gevşek nesne biriktirdiğinizde sormaktan ziyade, bunları delta sıkıştırmak için iyi adaylar bulur (git önceki sürümden farklı olabilir), deltaları bir "paket" içinde saklar ve gevşek nesneleri kaldırır.
Jan Hudec

3
Gerçek dünya rakamlarıyla ilgilenenler için: Ben sadece aynı repodan iki çalışma kopyasını karşılaştırdım. SVN çalışma kopyası yaklaşık 2,9 GB, GIT çalışma kopyası 0,8 GB civarındadır.
JensG
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.