Görüntüler git deposunda saklanmalı mı?


201

Git ve Github'ı sürüm kontrolü olarak kullanan dağıtık bir ekip için, görüntüler git deposunda da saklanmalı mı?

Çoğunlukla, görüntüler değişmeyecek. Bunları içeren klasör, resimler eklendikçe yalnızca boyut olarak büyür. Buradaki endişe, resim klasörünün, büyük resimlerin veya yalnızca birçoğunun kombinasyonu ile zaman içinde büyük bir boyuta büyümesidir.

Bu en iyi uygulama olarak mı kabul edilir? Dağıtılmış bir ekibin kolayca erişebileceği projelerde ihtiyaç duyulan ikili dosyaları paylaşmak için başka hangi alternatifler var?


17
"Resimler" derken 26 MB DSLR Raw dosyalarından, 1 MB 3d oyun dokularından veya <100k png simgelerinden mi bahsediyoruz? (Ben "buna bağlı" cevap verecektim ama kaçınacağım)
Brook

2
@Brook: Web siteleri için ikonlardan veya küçük grafik öğelerden bahsettiğimizi farz ettim. Oyun dokuları, grafik tasarım ham dosyaları veya dokümantasyon düzenleme için kesin grafikler farklı bir hikaye olabilir, haklısınız.
haylem

6
Ben şahsen ISO görüntüleri demek istediğini sanıyordum
Mahmud Hossam

2
Gerçekten küçük / orta boy web dostu görüntüler için olmalı. Bir endişe bazı olmasıdır dev-imza sahipleri bunu muhtemelen başka bir şey kullanmak gerektiğini düşünüyorum zaman, orada her büyük orijinal görüntüyü yapışmasını başlayacaktır.
spong

6
Bugün bu soruyu okumak? Git lfs üzerinde aşağıdaki cevaba bakın. Muhtemelen istediğin budur. programmers.stackexchange.com/a/306882/92506
jonnybot

Yanıtlar:


188

Resimleriniz orijinal mi çalışıyor yoksa başka bir yerden mi kurtarılabiliyor? Kaynaktan inşa edilmiş bir yazılım birimini göndermeleri gerekiyor mu? Orijinallerse, yedeklemeleri gerekir. Bunları revizyon kontrolünüze koyun, eğer hiç değişmezlerse, alan cezası bir yedek ile aynıdır ve ihtiyaç duyduğunuz yerdedir.

Yanlışlıkla veya kasıtlı olarak yazılımın görünümünü değiştirmek için düzenlenebilirler mi? Evet - o zaman bir şekilde revizyonla kontrol edilmeleri GEREKİR, neden zaten mükemmel bir çözüm varken başka bir yol kullan. Neden karanlık çağlardan "kopyala ve yeniden adlandır" sürüm kontrolünü başlattın?

Grafik tasarımcının MacBook sabit diski öldüğü zaman bütün bir projenin orijinal sanat eserinin "pes" gittiğini gördüm, çünkü sonsuz bilgeliğe sahip biri "ikili dosyalar devir kontrolüne dahil değil" ve grafik tasarımcılarının (en azından bu bir tane olduğuna karar verdi) ) yedeklerle iyi olma eğiliminde değilsin.

Aynısı yukarıdaki kriterlere uyan tüm ikili dosyalar için de geçerlidir.

Yapmamanın tek nedeni disk alanı. Korkarım ki 100 dolar / terabayt, bu bahane biraz zayıf.


44
BTW: İnternet güvenilir bir kaynak değil. "Bobsfreestuff.com" adresinden bir resim indirdiyseniz, muhtemelen önümüzdeki hafta orada olmayacak.
mattnz

16
+1 - ve + daha fazla olmalıdır. Sürüm kontrolünün amacı, bazı şeyler ne olursa olsun, bazı yollardan toparlanmanıza / geri dönmenize olanak sağlamaktır. % 100 olmanın tek yolu, bu noktada olması gerekenleri geri alabilmenin tek yolu, HERŞEYİ sürüm kontrolü altına almak. Bu kaynak, resimler, kaynaklar, yardımcı / destekleyici PDF'ler. Heck, Zipped CD görüntülerini bile içeri soktum. Hatta VM sanal makinesini (VMDK dahil) kaynak kontrolüne koyduğum bile biliniyor. Aşırı görünüyor? Pastırmamı 2 yıl sonra kurtardım.
hızla_ben

3
% 100 katılıyorum. Görüntüler yazılımın bir parçasıysa, revizyon kontrollü olmaları gerekir.
Dean Harding

14
Katılmamamın tek nedeni, repo'nuzu, geliştiricilerin aslında "bunu klonlamak için zaman ayırmak istiyorum mu, yoksa sadece bu diğer dalda X yapabilir miyim?" Diye düşündüğü noktaya klonlamak için hantal hale getirmesiydi. Bu durumda, işlerin çok hızlı bir şekilde yeniden organize
Brook

5
Konuşlandırma için ihtiyaç duyulan nokta için +1. Yeni bir takım üyesi olduğum için deponuzu klonlarsam, kutunun dışında kalması gerekir . Bu, gerektiğinde 3. parti kütüphaneleri elde etmek için yeterince akıllı bir makefile eşdeğeri bulundurmayı da içerir.
Spencer Rathbun

66

Neden olmasın? :)

İkili dosya depolamak kötü bir uygulama olarak kabul edilir, evet, ama görüntüler hakkında asla çok endişelenmedim.

En kötü durumda, tonunuz varsa, bunları başka bir yerde saklayın veya harici destek veya ikili destek için bir uzantı kullanın. Eğer görüntüler bu kadar sık ​​değişmeyecekse, sorun nerede? Büyük bir şişman delta elde edemezsin. Ve zamanla kaldırılırlarsa, geçmişi saklamaktan biraz muzdarip olan yalnızca sunucunuzdur, ancak istemciler bir şey görmezler.

Benim düşünceme göre, endişelenmemelisin - ki bunlardan GB’i saklamadığın için.

Ne olabilir gerçi yapın sadece mağaza "kaynak" görüntülerdir: vb SVG lezyonu, LaTeX makroları, ... ve yapı sistemi tarafından oluşturulan nihai görüntüler var. Yapabiliyorsan, muhtemelen daha da iyi. Değilse, o zaman rahatsız etmeyin.

(Bunların hepsi söylendiğinde Git, metin dosyaları için parlar, ancak fotoğraflar için en iyi VCS değildir. Mümkünse bize daha fazla bağlam ve ölçüm verin)


Ek bilgi için şu Soru ve Cevaplara bakmak isteyebilirsiniz:


4
Kaynağı depolamak için +1, ancak tam bir derlemesiz geliştirme testi yapabilirlerse, bu durum karışabilir. Bu, sabah işe başlamadan önce tüm görüntüleri oluşturmanız gerekeceği anlamına da gelir
TheLQ

@TheLQ: Sanırım, ama sonra belki de, aşağı havza (test) yapılarının yalnızca yukarı havza yapılarına (gerçek yapı) dayanabileceği basamaklı yapılara sahip olmalısınız. Ve sonra bunları yerel olarak test edenler tarafından tekrar kullanmak üzere ortak bir klasöre aktarın. Bu açıkçası biraz altyapıya işaret ediyor, ancak bu nispeten büyük bir takımda işleri yapma yolum olacak.
haylem

İkili dosyalar nedir?
Daniel Pendergast


5
"Neden olmasın?" - Eğer deponuz 2GB'ı aşarsa, Bitbucket (ve ben de Github ile denedim) reponuzu reddeder. Bu nedenle, tonlarca resimle onları şişirirseniz kendi depolarınızı barındırmaya hazır olun.
Jez,

48

Bu soru oldukça eski fakat bu, Git'le uğraşırken ortaya çıkan yaygın bir sorudur ve son cevaptan bu yana büyük dosyaları Git deposunda saklamak için modern çözümlerde bazı ilerlemeler kaydedilmiştir.

Git'te büyük dosyaları depolamak için aşağıdaki projeler var:

  • git-ek - Bu bir süredir var ama açıkçası karmaşıklığı engelliyor.
  • git-media - Bununla kişisel bir deneyim yok. Oldukça karmaşık görünüyor.
  • git-fit - Daha basit bir eklenti oluşturma denemesi. S3 depolama gerektirir. Sadeliği takdir etmeme rağmen, eklenti ile ilgili temel endişem, 1 kişi tarafından yeterince bilinmemesi ve sürdürülmemesi (tam açıklama, şu anda sadece başka bir üreticiyim ve önemsiz bir konu içindi).
  • git-lfs - Bunu yoğun olarak kullanmadığım halde kutsal kâse gibi görünüyor. Github tarafından desteklenmektedir ve Ekim 2015 itibariyle tüm depolarında bulunmaktadır ve dosya yönetiminin karmaşıklığını, depolarınızı depolamak için yerine koymaktadır. Sadece olumsuz olsa çok destek, yok Github ötesinde bu nedenle bu oldukça yeni olmasıdır Gitlab da desteği vardır , Gitea yaptığı gibi , ve Bitbucket gelecekte desteklemek ima etti .

TLDR: Yapabiliyorsanız, görüntüleri veya diğer ikili dosyaları git'e kaydetmek için git-lfs komutunu kullanın.


9
Uzun zamandır ilk defa, düşük oylu cevapları okumak için aşağı kaydırdığım için çok mutluyum. git lfs tam olarak istediğim şey ve Atlassian'ın BitBucket Sunucusuna destek bile kattığı ! Bunu milyonlarca kez yükseltebilirsem, yapardım.
jonnybot

7
@ jonnybot, teşekkürler. Çok geç bir cevap aldım, bu yüzden çok fazla görünürlük elde etmedim, ancak git-lfs kullandıktan sonra git'i ikili dosyaları saklamak için en iyi çözüm olduğunu düşünüyorum.
James McMahon,

45

"İkilileri kaynak denetiminde saklamayın" ifadesi belirli bir nedenden ötürü belirtilmiştir: Derleyen kaynak kodunuz varsa, gerçek derlemeyi saklamayın, sadece kaynak kodunu saklayın. Resimler ve görsel varlıkların bir "kaynağı" yoktur, bu nedenle sürüm kontrolünde izlenmeleri gerekir.


4
Bazen, görsel varlıklarda "kaynak gibi bir şey" olabilir ve daha sonra nihai çıktının yaratılma işlemini otomatikleştirmek ve kaynağı yalnızca sürüm kontrolünde saklamak iyi bir fikirdir. Örnekler: SVG dosyalarından yapılan raster grafik sürümleri, web sitesi varlıkları bir sprite sayfasından kesildi.
Tanius

Doğru, bu tamamen adil bir argüman.
Jason T Featheringham,

21

Git ile önerilen yolun, temelde ana sistemle ilişkili olan ayrı bir depo olan bir alt modül (Git 1.5.3'te tanıtılan) kullanmak olduğuna inanıyorum. Resimlerinizi (ve diğer ikili varlıkları) alt modülde saklarsınız. Bu daha sonra neyin gerekli olduğuna bağlı olarak ana havuzla veya sol ile kontrol edilebilir.

Gönderen http://book.git-scm.com/5_submodules.html

"Git'in alt modül desteği, bir havuzun bir alt dizin olarak harici bir projenin kasasını içermesine olanak tanır. superproject ") tüm alt modülleri aynı revizyonda kolayca klonlayabilir.

Ayrıca, görüntüler sıklıkla değişmiyorsa, boyut önemli bir sorun olmamalıdır. Ayrıca, budayı küçültmek / küçültmek için komutlar da kullanabilirsiniz:

git gc
git gc-aggressive
git prune

7

Evet .

Diyelim ki yazılım sürümünü 1.0 yayınladınız. 2.0 sürümü için, gölgelerle birlikte olacak tüm resimleri yeniden yapmaya karar veriyorsunuz. Yani, bunu yapın ve 2.0'ı bırakın. Sonra 1.0 kullanan ve 2.0'a yükseltemeyen bazı müşteriler, programı başka bir dilde istediklerine karar verir. Yapman için sana $ 1G veriyorlar, öyleyse kesin diyorsun. Ama farklı bir kültürde, bazı resimlerin bir anlamı yoktur, bu yüzden onları değiştirmelisin ...

Resimlerinizi kaynak kontrolünde tutarsanız, resimlerde değişiklik yapmanıza (diğer şeylerin yanı sıra), derlemeye, bırakmaya 1.0 dayanarak bu kolaydır. Bunları kaynak denetiminde ele geçirmeseydiniz, eski görüntüleri bulmak, değiştirmek ve daha sonra inşa etmek zorunda kalacağınız için çok daha zor zamanlar geçirirsiniz.


7

Projenin bir parçası ise, VCS'de olması gerekir . Bunun en iyi şekilde nasıl başarılacağı VCS'ye veya bir Projeyi nasıl organize ettiğinize bağlı olabilir. Belki tasarımcılar için bir repo ve yalnızca kodlayıcı deposundaki sonuçlar veya yalnızca 'Görüntü kaynakları' (bir zamanlar sadece bir .svg dosyasına sahip bir projem ve make / inscape cli aracılığıyla oluşturulan görüntüler).

Ancak, eğer bir VCS bunun üstesinden gelemezse veya kullanılamaz hale gelirse, işiniz için doğru araç olmadığını söylerim.

Şimdiye kadar git'deki web projeleri için 'her zamanki' miktarlarda grafikleri (örnekler, kavramlar ve sayfa grafikleri) koymakta sorun yaşamadım.


5

Resimlerinizi SCM'de saklamanız gerekir mi: evet. Hiç şüphesiz.

Resimlerinizi git'te saklamanız gerekir: bu daha zorlaşır.

git, metin dosyalarında çok iyidir, fakat doğası gereği ikili dosyalar için çok sıcak değildir. Klonladığınızda veya bastırdığınızda aktarılan verilerin boyutuyla ilgili sorunlarınız olacak, .git dizinleriniz büyüyecek ve birleştirme ile doğru bir karışıklık elde edebilirsiniz (yani 2 görüntüyü nasıl birleştirirsiniz!)

Bir cevap alt modülleri kullanmaktır, çünkü bu, projenizle görüntüler arasındaki bağlantının daha zayıf olacağı anlamına gelir - böylece görüntüleri kaynağınızın bir parçasıymış gibi yönetmeniz gerekmez, yine de kontrol altında tutulur ve Bunları kollara ayırmaktan endişe ediyorlar - alt projenin normal gelişim sürecinde aynı süreçten geçmeyen bir veri deposu olduğu varsayılıyor.

Diğer cevap, onları farklı bir projeye koymak, asla dallandırmamak ve bu projeye başlayan herkesin derhal yukarı doğru itmesini sağlamaktır - 2 kişinin dosyanın aynı sürümünü değiştirmesine asla izin vermeyin - bunu en zor bulursunuz git'in görünüşü, böyle dağınık olmayan bir iş akışı için tasarlanmamıştır. Bu kuralı uygulamak için eski moda iletişim yöntemlerini kullanmanız gerekecektir.

Üçüncü bir cevap, onları tamamen görüntülerle çalışmaya daha iyi odaklanan farklı bir SCM'ye koymaktır.


0

@ Haylem'in cevabına ek olarak, bu boyutta büyüklüğün önemli olduğunu unutmayın. VCS'ye bağlı olarak, tonlarca görüntüyle iyi çalışmayabilir. Klonlar veya büyük tüm gece çekmeye başladığında, tüm görüntüler depoda olduğu için gerçekten çok geç.

Büyük resimler ve gelecekteki büyüme için plan yapın. İki yıl boyunca bu projeye katılmak istemez ve "ah bok, belki repo biraz fazla büyüktür" almak istemezsin .


1
Cevabınız, soruya gitmeye özgü olduğu için , biraz ilgisizdir. Büyüklüğün git depoları için büyük (veya herhangi bir) bir faktör olup olmadığını biliyor musunuz?
yannis

@Yannis İlk cümleyi cevapsız olmalı ... AFAIK, git daha büyük havuzlarda daha iyidir, ancak boyut sorunu hala büyük klonlar ya da
iterler ile

GIT ile depoları yeniden düzenlemek ve kısmi klonlar oluşturmak vb. Revizyon kontrol araçlarının tarihsel pekmezini, on yıllardan bugüne kadarkilerle karıştırmayın.
mattnz

0

Teknik ve ekonomik olarak depolamanın mümkün olduğu konusunda kesinlikle hemfikirim. "Bu görüntüler nakliye ürününün bir parçası mı yoksa nakliye ürününün içeriğinin bir parçası mı?" İçeriği GIT’de (veya başka herhangi bir VCS’de) saklayamazsınız, ancak bunun ayrı bir VCS için ayrı bir problem olduğu anlamına gelmez.

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.