Git'te büyük dosyaları yönetme ve depolama

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

Git, sürümler arasındaki farklar kolayca seçildiği ve kodun kolayca sıkıştırıldığından kaynak kodunuzun ayak izini küçük tutmaya yardımcı olur. İyi sıkıştırılan ve sürümler (ikili dosyalar gibi) arasında tamamen değişen büyük dosyalar, Git depolarınızda depolandığında sorun oluşturur. Git'in hızlı performansı, yerel depolama alanından bir dosyanın tüm sürümlerine hitap etme ve bu sürümlere geçiş yapma özelliğinden gelir.

Deponuzda büyük ve fark edilemeyen dosyalarınız varsa (ikili dosyalar gibi), deponuzda her değişiklik yaptığınız her seferde bu dosyaların tam kopyasını saklarsınız. Deponuzda bu dosyaların birçok sürümü varsa kodunuzu kullanıma alma, dallama, getirme ve kopyalama süresini önemli ölçüde artırır.

Git'te ne tür dosyalar depolamanız gerekir?

Bağımlılıkları değil kaynak kodu işleme

Ekibiniz dosya oluşturmak ve güncelleştirmek için düzenleyiciler ve araçlarla birlikte çalıştığından, ekibinizin Git iş akışının avantajlarından yararlanabilmesi için bu dosyaları Git'e yerleştirmeniz gerekir. Deponuza başka türlerde dosya işlemeyin: örneğin DLL'ler, kitaplık dosyaları ve ekibinizin oluşturmadığı ancak kodunuzun bağımlı olduğu diğer bağımlılıklar. Bu dosyaları paket yönetimi aracılığıyla sistemlerinize teslim edin.

Paket yönetimi bağımlılıklarınızı paketler ve paketi dağıttığınızda dosyaları sisteminize yükler. Paketler, ortamlar aynı yüklü paketlere sahip olduğu sürece bir ortamda test edilen kodun başka bir ortamda aynı şekilde çalıştığından emin olmak için sürümlenir.

Çıkışları işleme

Derlemelerinizden ve testlerinizden ikili dosyaları, günlükleri, izleme çıkışlarını veya tanılama verilerini işlemeyin. Bunlar, kaynak kodun kendisinden değil, kodunuzdan alınan çıkışlardır. İş öğesi izleme araçları veya ekip dosya paylaşımı aracılığıyla günlükleri ve izleme bilgilerini ekibinizle paylaşın.

Git'te küçük, seyrek güncelleştirilen ikili kaynakları depolama

Seyrek güncelleştirilen ikili kaynak dosyalarında nispeten az sayıda sürüm işlenmiştir. Dosya boyutları küçükse çok fazla yer kaplamazlar. Web görüntüleri, simgeler ve diğer küçük resim varlıkları bu kategoriye girilebilir. Ekibinizin tutarlı bir iş akışı kullanabilmesi için bu dosyaları git'te kaynağınızın geri kalanıyla birlikte depolamak daha iyidir.

Önemli

Küçük ikili dosyalar bile sık sık güncelleştiriliyorsa sorunlara neden olabilir. Örneğin, 100 KB ikili dosyada yapılan 100 değişiklik, 1 MB ikili dosyada 10 değişiklik kadar depolama alanı kullanır. Güncelleştirmelerin sıklığı nedeniyle, küçük ikili büyük ikiliden daha sık dallanma performansını yavaşlatır.

Büyük, sık güncelleştirilen ikili varlıkları işlemeyin

Git, dosyanın bir ana sürümünü yönetir ve ardından yalnızca bu sürümden farkları, deltification olarak bilinen bir işlemde depolar. Ltifikasyon ve dosya sıkıştırma, Git'in kod geçmişinizin tamamını yerel deponuzda depolamasına olanak sağlar. Büyük ikili dosyalar genellikle sürümler arasında tamamen değişir ve genellikle zaten sıkıştırılmıştır. Sürümler arasındaki farklar büyük olduğundan Git'in bu dosyaları yönetmesi zordur.

Git, dosyanın her sürümünün tüm içeriğini depolamalıdır ve deltifikasyon ve sıkıştırma yoluyla alandan tasarruf etmekte zorlanır. Bu dosyaların tam sürümlerinin depolanması, depo boyutunun zaman içinde artmasına neden olur. Artan depo boyutu dallanma performansını azaltır, kopyalama sürelerini artırır ve depolama gereksinimlerini genişletir.

Büyük ikili kaynak dosyalarıyla çalışma stratejileri

  • Sıkıştırılmış veri arşivlerini işlemeyin. Dosyaların sıkıştırmasını açmak ve fark edilebilir kaynakları işlemek daha iyidir. Git'in deponuzdaki verileri sıkıştırmayı işlemesine izin verin.
  • Derlenmiş kodu ve diğer ikili bağımlılıkları işlemekten kaçının. Kaynağı işleyin ve bağımlılıkları oluşturun veya bu dosyaları sürüme alıp sisteminize sağlamak için bir paket yönetimi çözümü kullanın.
  • Yapılandırmayı ve diğer yapılandırılmış verileri JSON gibi fark edilebilir düz metin biçimlerinde depolayın.

Git LFS nedir?

Sürümler ve sık güncelleştirmeler arasında büyük farklara sahip kaynak dosyalarınız varsa, bu dosya türlerini yönetmek için Git Büyük Dosya Depolama (LFS) kullanabilirsiniz. Git LFS, deponuza yönelik bir işlemedeki büyük dosyaları açıklayan veriler sağlayan bir Git uzantısıdır. İkili dosya içeriğini ayrı bir uzak depolamada depolar.

Deponuzdaki dalları kopyaladığınızda ve değiştirdiğinizde, Git LFS doğru sürümü söz konusu uzak depolamadan indirir. Yerel geliştirme araçlarınız dosyalarla doğrudan deponuza kaydedilmiş gibi saydam bir şekilde çalışır.

Sosyal haklar

Git LFS'nin avantajlarından biri, ekibinizin hangi dosyaları oluşturduğundan bağımsız olarak tanıdık uçtan uca Git iş akışını kullanabilmesidir. LFS, büyük dosyaları işleyerek bunların genel depoyu olumsuz etkilemesini önler. Ek olarak, 2.0 sürümünden itibaren Git LFS, ekibinizin videolar, sesler ve oyun haritaları gibi büyük, değiştirilemez varlıklar üzerinde çalışmasına yardımcı olmak için dosya kilitlemeyi destekler.

Git LFS, Azure DevOps Services'da tam olarak desteklenir ve ücretsizdir. LFS'yi Visual Studio ile kullanmak için Visual Studio 2015 Güncelleştirme 2 veya üzeri gerekir. İstemciyi yüklemek, yerel deponuzdaki dosyalar için LFS izlemeyi ayarlamak ve değişikliklerinizi Azure Repos'a göndermek için yönergeleri izlemeniz gerekir.

Sınırlamalar

Git LFS'nin benimsemeden önce göz önünde bulundurmanız gereken bazı dezavantajları vardır:

  • Ekibinizin kullandığı her Git istemcisiNin Git LFS istemcisini yüklemesi ve izleme yapılandırmasını anlaması gerekir.
  • Git LFS istemcisi doğru yüklenmez ve yapılandırılmazsa, deponuzu kopyaladığınızda Git LFS aracılığıyla işlenen ikili dosyaları görmezsiniz. Git, ikili dosyayı değil büyük dosyayı (Git LFS'nin depoya işlediği işlemdir) açıklayan verileri indirir. Git LFS istemcisi yüklü değilken büyük ikili dosyalar işlendiğinde, ikili dosya deponuza gönderilir.
  • İkili dosyanın iki farklı sürümünün üst öğesi aynı olsa bile Git bu iki farklı sürümdeki değişiklikleri birleştiremez. İki kişi aynı anda aynı dosya üzerinde çalışıyorsa, bir kişinin diğerinin çalışmasının üzerine yazmasını önlemek için birlikte çalışmaları ve değişikliklerini mutabık kılmaları gerekir. Git LFS bu konuda yardımcı olmak için dosya kilitleme sağlar. Kullanıcılar yine de çalışmaya başlamadan önce ikili dosya varlığının en son kopyasını çekmeye özen göstermelidir.
  • Azure Repos şu anda Git LFS izlenen dosyalarıyla depolarda Secure Shell (SSH) kullanmayı desteklememektedir.
  • Kullanıcı, web arabirimi aracılığıyla bir ikili dosyayı Git LFS için yapılandırılmış bir depoya sürüklerse, ikili dosya Git LFS istemcisi aracılığıyla işlenecek işaretçilere değil depoya işlenir.
  • Katı bir dosya boyutu kısıtlaması olmasa da, sunucunun kullanılabilir boş alanı ve geçerli iş yükü performansı ve işlevselliği kısıtlayabilir.
  • Bir dosya karşıya yükleme için süre sınırı bir saattir.

Dosya biçimi

Git LFS izlenen dosyası için deponuza yazılan dosyanın her satırda bir anahtar/değer çifti olan birkaç satırı vardır:

version https://git-lfs.github.com/spec/v1
oid a747cfbbef63fc0a3f5ffca332ae486ee7bf77c1d1b9b2de02e261ef97d085fe
size 4923023

Not

Sürüm değeri için eklenen GitHub URL'si yalnızca LFS işaretçisi dosya türünü tanımlar. İkili dosyanızın bağlantısı değildir.

Bilinen sorunlar

Azure DevOps Server ile LFS'nin 2.4.0'dan önceki bir sürümünü kullanıyorsanız, Kerberos yerine NTLM aracılığıyla kimlik doğrulaması yapmak için ek bir kurulum adımı gerekir. LFS 2.4.0 itibarıyla bu adım artık gerekli değildir ve yükseltmenizi kesinlikle öneririz.