Git ikili dosyalarda iyi midir?


101

Git ikili dosyalarda iyi midir?

Değiştirilen çok sayıda sıkıştırılmamış dosyam varsa ve çoğu sıkıştırılmış dosya hiçbir zaman (veya neredeyse hiç değiştirilmezse) değiştirilseydi, git bunu iyi halleder mi? Örneğin, ortayı eklersem veya kaldırırsam ve sonuna yakın bir veri eklersem, metinde olduğu gibi bunu fark edecek mi?

Git ikili dosyalarda iyi değilse, hangi aracı düşünebilirim?


1
ikili ile çok iyi - kendim kullanıyorum
tekknolagi

Bu biraz doğru. / Evinizi git revizyonu altına alabilirsiniz ve oldukça iyi çalışmalıdır.
Loïc Faure-Lacroix

1
Bu, ikili dosyaların üzerlerinde diff işlemi yapıp yapmadığıyla ilgili olarak açıkça belirtilen sorunun ruhuna uygun değildir (muhtemelen depo şişkinliği ve performans nedenleriyle). Ancak, olumsuz oy vermedim (ve o zamandan beri kim yaptıysa kaldırmış görünüyor).
coreyward

1
Not: Artık ikili dosyalarınızı başka bir yerde saklamak için git-lts'e sahipsiniz: stackoverflow.com/a/29530784/6309
VonC

1
.Git klasörünü şişiriyor mu?
Porcupine

Yanıtlar:


50

Kutunun dışında git, ikili dosyaları kendi dizinine kolayca ekleyebilir ve ayrıca, büyük sıkıştırılamaz dosyalar üzerinde sık sık güncelleme yapmadığınız sürece bunları verimli bir şekilde depolayabilir.

Git'in farklar ve birleştirme oluşturması gerektiğinde sorunlar başlar: git anlamlı farklar oluşturamaz veya ikili dosyaları anlamlı olabilecek herhangi bir şekilde birleştiremez. Bu nedenle, bir ikili dosyada yapılan bir değişikliği içeren tüm birleştirmeler, yeniden başlatmalar veya kirazlar, o ikili dosyada manuel bir çakışma çözümü yapmanızı gerektirecektir.

İkili dosya değişikliklerinin, birleştirmeleri, yeniden yapılandırmaları ve kirazları içeren normal git iş akışında neden oldukları ekstra manuel çalışmayla yaşayabileceğiniz kadar nadir olup olmadığına karar vermeniz gerekir.


27
İkili dosya değişikliklerinin bir sorun olmadığını, birden çok yerde değişiklik yapmanın ve sonra bunları birleştirmeye çalışmanın bir sorun olmadığını belirtmek zorundayım.
Winston Ewert

15
git anlamlı farklar oluşturabilir. İle oluşturulan bir fark git diff --binary, ikili dosyalara yama uygulayabilecektir.
CB Bailey

47

Diğer cevaplara ek olarak.

  • İkili fark biçimini kullanarak ikili dosyaya bir fark gönderebilirsiniz . İnsan tarafından okunamaz ve yalnızca deponuzda tam ön görüntü varsa , yani herhangi bir tüy olmadan uygulanabilir.
    Bir örnek:

    diff --git a/gitweb/git-favicon.png b/gitweb/git-favicon.png
    index de637c0608090162a6ce6b51d5f9bfe512cf8bcf..aae35a70e70351fe6dcb3e905e2e388cf0cb0ac3 100
    GIT binary patch
    delta 85
    zcmZ3&SUf?+pEJNG#Pt9J149GD|NsBH{?u>)*{Yr{jv*Y^lOtGJcy4sCvGS>LGzvuT
    nGSco!%*slUXkjQ0+{(x>@rZKt$^5c~Kn)C@u6{1-oD!M<s|Fj6
    
    delta 135
    zcmXS3!Z<;to+rR3#Pt9J149GDe=s<ftM(tr<t*@sEM{Qf76xHPhFNnYfP!|OE{-7;
    zjI0MY3OYE5upapO?DR{I1pyyR7cx(jY7y^{FfMCvb5IaiQM`NJfeQjFwttKJyJNq@
    hveI=@x=fAo=hV3$-MIWu9%vGSr>mdKI;RB2CICA_GnfDX
    
  • Sen kullanabilirsiniz TextConv gitattribute olması git diffikili dosyaları veya ikili dosyaların parçaları için gösteri insan tarafından okunabilir diff. Örneğin * .jpg dosyaları için EXIF ​​bilgilerinde farklılık olabilir, PDF dosyaları için metin gösterimleri arasında farklılık olabilir (pdf2text veya buna benzer bir şey).

HTH.


5
Bana git özelliklerini öğrettiğin için çok teşekkürler! Yepyeni bir olasılıklar dünyası açar.
hermannloose

15

Gerçekten büyük ikili dosyalarınız varsa, verileri havuzun dışında depolamak için git-annex'i kullanabilirsiniz. Kontrol edin: http://git-annex.branchable.com/


6
Git-annex oldukça harika, ancak çok sık değişmeyen dosyalar için muhtemelen daha uygun , örneğin müzik dosyaları, resimler, PDF'ler, ...
sr_

@sr_ tam olarak, Git LFS de öyle. Görünüşe göre bu tür kullanım durumları için uygun bir sürüm kontrol sistemi yok gibi, aynı zamanda temel olarak dağıtılmış bir sisteme sahip (Git gibi).
Marc J. Schmidt

5

Sürüm kontrolü için ikili dosyaların farklarını depolamaya çalışan herhangi bir araç bilmiyorum, ancak Git'in bunu metin dosyaları için bile yapmadığını belirtmek gerekir. Git, dosyaları bloblar olarak depolar ve gerektiğinde aralarında bir fark yaratır.

Photoshop / Illustrator belgeleri gibi bir şey üzerinde sürüm kontrolü yapmak istiyorsanız, GridIron Flow sizin için hile yapabilir. Onları makineler arasında senkronize tutmaya çalışıyorsanız, Dropbox veya Rsync bunu halledebilir, ancak akıllı farklar yapmayacaklar.


1
Git topluluk kitabından ( book.git-scm.com/7_how_git_stores_objects.html ): "Git, bu alanı kurtarmak için paket dosyasını kullanır. Bu, Git'in yalnızca ikinci dosyada değişen kısmı kaydedeceği bir biçimdir , dosyaya bir işaretçi ile benzerdir. "
Wayne Conrad

2
Evet, eğer git gcçöp toplamak için koşarsan. Aynı sayfadan: "Git, her dosyanın her sürümünü ayrı bir nesne olarak sakladığından, oldukça verimsiz hale gelebilir. Birkaç bin satır uzunluğunda bir dosyaya sahip olduğunuzu ve tek bir satırı değiştirdiğinizi hayal edin. Git, ikinci dosyayı bir bütün olarak saklayacaktır. büyük bir alan israfıdır. "
coreyward

2
Adil 'nuff. git ara sıra gc'yi otomatik olarak yapıyor, en azından onu kullandığım proje için. Ne zaman çalışacağına karar vermek için hangi metriği kullandığını bilmiyorum - belki de gc'yi asla (veya nadiren) tetiklemeyen ağaçlar vardır.
Wayne Conrad

1
Şu man sayfasından git gc: "Kullanıcıların, iyi disk alanı kullanımını ve iyi işletim performansını sürdürmek için her havuzda bu görevi düzenli olarak çalıştırmaları önerilir. Bazı git komutları otomatik olarak git gc çalıştırabilir; ayrıntılar için aşağıdaki --auto bayrağına bakın . "
Jacob Akkerboom

1
@KennyEvitt Artık bir ton var. Soyut bir tanesidir ve Kactus , perde arkasında git kullanan bir diğeridir.
coreyward

4

Git ikililerde iyidir. Ancak metin dosyaları gibi ikili dosyaları işlemez. İkili dosyaları birleştirmek istediğiniz gibi. Demek istediğim, bir jpeg'deki fark size asla hiçbir şey döndürmez. Git metin dosyasıyla çok iyi çalışıyor ve muhtemelen ikili dosyalar için diğer tüm çözümler kadar kötü!


2

sürüm oluşturma için bir çözüm istiyorsanız , dosyanıza hafif bir işaretçi olan git-lfs'yi düşünebilirsiniz .

Bu, deponuzu klonladığınızda tüm sürümleri değil, yalnızca teslim alınan sürümü indirdiği anlamına gelir.

İşte nasıl kullanılacağına dair güzel bir öğretici

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.