Çok GB'lı bir SVN deposunu Git'e taşıma


13

Şu anda şirketimin SVN deposunda aşağıdaki gibi organize edilmiş bir Visual Studio çözümü var:

SolutionFolder (~3.5 GB)
|-> SolutionName.sln
|-> .. Some source code folders... (~250 MB)
|-> ThirdParty (~3 GB)
|-> Tools
    | -> Tool1
    | -> Tool2

Araç1 ve Araç2 bağımsız olarak oluşturulur (kendi çözümlerine sahiptir), ancak ana yapıda kullanılan yürütülebilir dosyalar üretir. ThirdParty klasörü, bazı önceden derlenmiş 100+ MB .lib dosyaları ve boost gibi büyük kütüphaneler dahil olmak üzere proje için tüm bağımlılıkları içerir.

Hepsini bir SVN deposunda bulundurmak uygundur, böylece (1) geliştiricinin yalnızca bir çıkış yapması gerekir ve (2) yapının her sürümü için hangi bağımlılık sürümlerine ihtiyacımız olduğunu takip etmemiz gerekmez. Kapak tarafında, bu repoya bakmak biraz zaman alıyor.

Bu proje yapısını git'e taşımanın en iyi yolu ne olurdu? Muhtemelen ThirdParty ve muhtemelen Tools'u ana repodan hariç tutmak en iyisidir, ancak ThirdParty'yi bir adımda kolayca indirilebilir tutmak istiyoruz ve sürümlendirilmesini beğendik (ve ana repo ile ThirdParty / Tools arasındaki sürüm uyumsuzlukları kötü olurdu).

Bu noktada, tarihi korumakla değil, sadece böyle bir projenin nasıl organize edileceğini bulmakla ilgileniyorum.


Bu boyutlar geçmiş dahil depolardaki boyutların üstünde mi, yoksa yerel çalışan kopyanın boyutları mı?
Doc Brown

1
@DocBrown sadece yerel çalışan kopya, tarih içermez.
ikh

Yanıtlar:


10

İş için uygun aleti kullanın. Windows'da bu,

Üçüncü taraf bağımlılıkları için NuGet kullanma

Bu şekilde, üçüncü taraf bağımlılıkları sürümlü bir şekilde tutarsınız, ancak deponuzu gereksiz şeyler ile şişirmezsiniz. Kasalar çok daha hızlıdır ve proje olması gerektiği gibi düzenlenmiştir. Visual Studio'da bir seçeneği etkinleştirerek tüm bağımlılıkları her zaman otomatik olarak indirir.

Tabii ki sadece git (başka bir repo, alt modüller vb.) Kullanan bir çözüm kullanabilirsiniz, ancak bu sadece hack'tir. Doğru şekilde yapmak hızlı bir şekilde ödeme yapacak ve sizi geleceğe hazır bir sisteme bırakacaktır.

Yorumlardan sonra düzenleme: NuGet'i kullanmanın en iyi yolu, paylaşılan bir sürücüde veya tam bir nuget sunucusunda yerel bir NuGet kaynağı kurmaktır. Kurulum her iki şekilde de birkaç dakikadan fazla sürmemelidir. Bu şekilde, nereden olursa olsun, ihtiyacınız olan tüm paketlerin her zaman kullanılabilir olmasını garanti edebilirsiniz.


NuGet komut satırı derlemelerini destekliyor mu? Her zaman Jenkins'in benim için inşa etmesini ve test etmesini sağlayabileceğim portatif bir yapı arıyorum. NuGet Jenkins gibi CI sunucularını destekliyor mu?
Ocak'ta amca

Bir düşünce daha, ürününüzü ne kadar süre desteklemeniz gerekiyor? Çok uzun süre destek sağlamanız gerekiyorsa, üçüncü taraf kütüphanelerinizin NuGet'te bulunabilmesi için doğru sürümüne güvenmem. Üçüncü parti araçların doğru kombinasyonunu elde etmek için 2-3 yıl sonra bile NuGet gibi araçlara dayanan çok büyük sorunlarla karşılaşabilirsiniz.
Ocak'ta amca 0

3
@uncletall: evet, NuGet'in eksiksiz bir komut satırı arayüzü var. Ve fikir, bir ağ paylaşımında ("feed" olarak adlandırılan bir klasör olabilir) yerel bir NuGet deposu kurmaktır. Docs.nuget.org/docs/creating-packages/… )
Doc Brown

Evet, elbette yerel bir ayna kullandığınızı varsaydım. Cevabı güncelleyeceğim.
Wilbert

2
@ikh Dış bağımlılıklar için nuget paketleri oluşturmak oldukça basit ve basittir. Ben daha önce hiç yapmadım, 50 dll ile 9 bağımlılıkları paketlemek için yaklaşık yarım gün gerekiyordu.
Wilbert

5

Aletler için alt modülleri kullanabilirsiniz . Bu şekilde onları şimdi yaptığınız gibi bir alt dizinde tutabilir ve sürümlendirmek için ayrı bir repo kullanabilirsiniz. Bu aynı zamanda araçları klonlayabileceğiniz (kontrol edebileceğiniz) ve ayrı ayrı geliştirebileceğiniz ve diğer projelerin bu depolara ve bunların belirli, uyandırılabilir sürümlerine de güvenebileceği anlamına gelir.

Üçüncü parti kütüphaneler için alt modülleri de kullanabilirsiniz, ancak mümkünse bunlar için bir bağımlılık yöneticisi kullanmanızı tavsiye ederim.


4

Git depolarına çevirdiğiniz varlıklar mutlaka sürüm ve şube yaptığınız varlıklardır; eğer SolutionFolder/Tools/Tool1böyle bir şeye karşılık gelirse , bu varlık seviyesidir. Git bir olması (hatta iyi bir fikir değil ise) svn ile mümkündür, oysa versionable varlık olarak dizin ağacının her haline ilişkin Bunun nedeni trunk, branchesve tagsher yerde ağacın içinde.

Türetilmiş eserler depoda veya harici kütüphanelerde tutulmamalıdır. Bunlarla başa çıkmanın daha iyi yolları var. (Java ile çalışıyorsanız, özel bir Maven deposu kullanmayı düşünün; Onlarla çalışmak nispeten kolaydır ve diğer birçok şeyle güzel bir şekilde bütünleşir.)

Ödeme kolaylığı için tek bir depoda her şeye sahip bir iş akışına alışkınsanız, bunun yerine işleri ayarlayan bir komut dosyasına sahip olmayı düşünün.


Harici kütüphaneleri yönetme seçenekleri nelerdir? Visual Studio üzerinde C ++ ve C # ile çalışıyoruz, bu yüzden Maven iyi bir uyum gibi görünmüyor. Burada asıl mesele ThirdParty, repodaki klasöre sahip olmak çok uygun ve iyi bir alternatif bulmak zor.
14'te ikh

2
@ikh: Visual Studio ortamında, bunun için genellikle Nuget'i kullanırsınız , bunun için VS 2012 ve daha yeni sürümlerinde zaten bulunan docs.nuget.org .
Doc Brown

2

Dürüst olmak gerekirse, kurulumunuzda hiçbir şeyi değiştirmezdim. Şimdi tam olarak bunu yapıyoruz. Kullandığımız üçüncü taraf lib'i işlemek için ayrı bir git deposu kurarak oynuyordum, ancak taşınabilirlik maliyetine kadar ağır olduğunu düşünmüyorum. Artık herhangi bir geliştirici, herhangi bir manuel kurulum işlemi yapmak zorunda kalmadan ödeme yapabilir ve başlayabilir. Ve ben herhangi bir yapı sunucusu / köle proje inşa edebilirsiniz. Üç parçalı araçları paylaşan çoklu depolarınız olmadıkça, şu anki kurulumunuza sadık kalırım.

Birlikte oynadığım üçüncü taraf araçlarını ayrı bir repoda kurmaktı. Sonra sha1 ref ile bir metin dosyasını okumak ve doğru sürümü ödeme basit bir toplu komut dosyası vardı. Bu, farklı projeler için farklı üçüncü taraf sürümlerine sahip olmamı sağlayacaktır. Bu fikri Facebook Buck derleme aracından aldım. Ama sonunda birçok geliştirici komut satırı araçlarını (MS VC mağazası) kullanmaktan hoşlanmıyor, bu yüzden bu fikirden vazgeçtim.

Üçüncü taraf kütüphanelerinizi ihtiyaç duyduğunuzda (NuGet kullanarak) indirmemenizin önemli bir nedeni, ürününüzü uzun süre desteklemeniz gerektiğidir. Sektörümde, bazen eski üçüncü taraf kütüphanelerine dayanan eski sürümler için güncellemeler sağlamalıyız. Hangi lbs'leri yükseltebileceğimizi veya edemeyeceğimizi sıralamak için çok fazla zaman harcamak istemiyoruz ve sadece bu versiyonda kullanılan libs'i kullanıyoruz. Şimdi NuGet'i kullandığınızı düşünün, ayy ... ihtiyacınız olan lib'in en son sürümü 3.98 ama 2.04'e ihtiyacınız var ..... patronunuza eski sürümü yükseltmek için 2 ay harcamanız gerektiğini nasıl açıklayacağınızı küçük bir değişiklik beklerken en son libs kullanmak için!


3
Sana bir +1 vermiş olsam da, "her şeyi olduğu gibi bırak" pragmatik bir çözüm olduğundan, bence "çoklu depolar" tek sorun olmayabilir. Git gibi DVCS, birden çok yerel şubeye sahip olmayı ve her şubede her şeyin eksiksiz bir yerel kopyasını almayı teşvik eder. Bu, yerel bir kopyayla aynı büyük üçüncü taraf kütüphanesine (genellikle aynı sürüm!) Birden çok kez sahip olabilir. Bu bazı durumlarda mümkün olabilir, bazılarında bunun dallanma ve birleştirme performansı üzerinde olumsuz bir etkisi olacağını hayal edebilirim.
Doc Brown

Bildiğim kadarıyla, bir şube Git'te sadece bir işaretçi oluşturacak ve neredeyse sıfır yer alacak çok ucuz bir işlem.
Ocak'ta amca 0

1
@DocBrown related: Git'te “dallanma ücretsiz” ne demektir?

Bir şeyi kaçırmadıkça, Git'te şubeler "özgür" olur. Sadece .git / refs / kafalarımı kontrol ettim ve tüm şubeler 1KB metin dosyaları, .git / logs / refs / head, master için en büyük 11KB olan günlükleri içeriyor .. Normal proje yapım kodda yaklaşık 500MB, üçüncü taraf kütüphaneleri ve diğer araçlar. Şube oluşturmak için 1KB isabetini almaktan çok mutluyum
Ocak'ta amca

1
@MichaelT: Dallanma elbette ücretsizdir, ancak yerel iş istasyonunuzda paralel olarak farklı dalların birden fazla çalışma kopyasına sahip olduğunuz durumdan bahsediyorum . Orijinal sorunun altındaki yorumları kontrol ederseniz, OP 3GB üçüncü taraf araçlarından çalışan kopyanın boyutu olarak bahsediyordu.
Doc Brown
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.