Git'e taşırken büyük svn tarihçesi hakkında ne yapmalı?


23

Düzenleme: gibi bazı benzer soruların aksine Git için çok GB SVN repo Hareketli veya /programming/540535/managing-large-binary-files-with-git My senaryo olduğunu birkaç alt projeleri içermez Kolayca git alt modellerine, ne de git-ek için uygun olan bir çok büyük ikili dosyalara dönüştürülebilir. İkili dosyaların, aynı revizyonun ana kaynak koduna sıkıca bağlanmış test paketi olduğu, grafik gibi zaman varlıkları derlediklerinde olduğu gibi tek bir depo.

Svn'den eski orta / büyük boyutlu (50 kullanıcı, 60k revizyon, 80Gb geçmiş, 2Gb çalışan kopya) kod deposu değiştirmeyi araştırıyorum. Kullanıcı sayısı arttıkça, bagajda çok fazla karmaşası vardır ve özellikler kod incelemesini zorlaştıracak şekilde birçok komisyona dağılır. Ayrıca dallanma olmadan kötü kodları "kapamak" için bir yol yoktur, yorumlar sadece bagaja yüklendikten sonra yapılabilir . Alternatifleri araştırıyorum. Gitmeye gidebileceğimizi umuyordum, ama bazı problemlerim var.

Mevcut reponun git gitmesine kadar olan sorunu büyüklük. İçeride çok fazla eski gemi var ve git'e dönüştürürken -filter şubesi ile temizlenmesi, büyüklüğüyle 5-10GB'a kadar boyutta kesebiliyor. Bu hala çok büyük. Büyük depo boyutunun en büyük nedeni, testlere girdi olan çok sayıda ikili belgenin bulunmasıdır. Bu dosyalar .5mb ile 30mb arasında değişir ve yüzlerce var. Ayrıca oldukça fazla değişiklik var. Alt-modüller, git-ek vb.

Yani git'in dağınık doğası gerçekten onu benimsemeyi engelleyen şey. Gerçekten dağınık umurumda değil, sadece ucuz dallanma ve güçlü birleştirme özellikleri istiyorum. Git kullanıcılarının% 99.9'unun yaptığı gibi, kutsanmış, çıplak bir merkezi depo kullanacağız.

Git'i kullanırken neden her kullanıcının tam bir yerel geçmişe sahip olması gerektiğinden emin değilim? İş akışı merkezileşmemişse, kullanıcıların disklerinde bu ne yapıyor? Git'in son sürümlerinde, yalnızca yakın geçmişe sahip sığ bir klon kullanabileceğinizi biliyorum. Sorum şu: bunu bütün bir ekip için standart çalışma şekli olarak yapmak mümkün mü? Git her zaman sığ olacak şekilde yapılandırılabilir, böylece yalnızca merkezi olarak tam bir geçmişe sahip olabilirsiniz, ancak varsayılan olarak kullanıcılar yalnızca 1000 devir geçmişe sahip midir? Elbette ki bu seçenek sadece 1000 devir sayısını git'e çevirmek ve arkeoloji için svn deposunu tutmaktı. Ancak bu senaryoda, test dokümanlarında yapılacak birkaç bin revizyondan sonra aynı problemle tekrar karşılaşacağız.

  • O birçok ikili dosyaları içeren büyük repo ile budala kullanmak için iyi bir iyi uygulama nedir do geçmişini ister misin? En iyi uygulamalar ve öğreticiler bu durumdan kaçınıyor görünmektedir. Birkaç büyük ikili dosya sorununu çözerler ya da ikili dosyaların tamamen düşürülmesini önerirler.
  • Sığ klonlama normal bir çalışma şekli olarak kullanılabilir mi, yoksa "kesmek" mi?
  • Alt modüller, ana kaynak revizyonu ve alt modül revizyonu (derleme zamanı ikili bağımlılıklarında veya birim test takımında olduğu gibi) arasında sıkı bir bağımlılığın olduğu kod için kullanılabilir mi?
  • Git deposu (tesis içi) için "çok büyük" ne kadar büyük? 4GB'a indirebilirsek değişmekten kaçınmalı mıyız? 2GB?


Bu konuda bilgi almak için çok şey aradım ve sorumu cevaplayan hiçbir şey bulamadım. Bağlantılı soruda iş dünyası (alt modüller, ek vb.) Senaryomda olduğundan daha iyi çalışacaktı.
Anders Forsgren


Performans, pek çok oyun geliştiricisi tarafından kullanılan çok sayıda büyük ikili dosyayla başa çıkmak için tasarlandığı için git'ten daha iyi bir seçenek olabilir. Plasticscm de bakmaya değer.
Ian

Sadece bir kenara: Eğer inşa sistemini aşırı karmaşık hale getirdilerse (durumunuzda zaten karmaşık olan), git alt modüllerinden kaçının.
IgorGanapolsky 21:16

Yanıtlar:


10

Vay, bu uzun bir soru (ve karmaşık bir sorun). Ben bir şeyler yapmaya çalışacağım.

Git'i kullanırken neden her kullanıcının tam bir yerel geçmişe sahip olması gerektiğinden emin değilim?

Bu git ile merkezi bir tasarım kararıdır. Kesin nedenlerden ötürü yazara (Linus Torvalds) sormanız gerekecek, fakat bildiğim kadarıyla ana sebep hız: Her şeyin yerel olması (hızlı bir diskte veya hatta RAM'de önbelleğe alınmış) tarihe ilişkin işlemleri çok daha hızlı hale getiriyor ağ erişimini önleyerek.

Büyük depo boyutunun en büyük nedeni, testlere girdi olan çok sayıda ikili belgenin bulunmasıdır. Bu dosyalar .5mb ve 30mb arasında değişir ve yüzlerce var. Ayrıca oldukça fazla değişiklik var.

İlk önce düşüneceğim nokta bu. Kaynak kontrolde sürekli değişen çok sayıda ikili dosyaya sahip olmak benim için problemli gözüküyor (SVN'de bile). Farklı bir yaklaşım kullanamaz mısın? fikirler:

  • Kaynak kodun aksine, 3 MB'lık bir ikili dosya muhtemelen elle yazılmaz. Bazı araçlar / işlemler üretiyorsa, verileri depolamak yerine bunu yapınıza entegre etmeyi düşünün.

  • Bu pratik değilse, ikili dosyalar tipik olarak bir yapay depoda daha iyidir (Maven ve diğerleri için Artifactory gibi). Belki bu senin için bir seçenektir.

Alt-modüller, git-ek vb.

Aslında, bu git-ek'in mükemmel bir şekilde uyduğu gibi görünüyor. git-annex temelde dosya içeriğini bir git deposunun dışında saklamanıza izin verir (depo bunun yerine bir yer tutucu içerir). Dosya içeriğini çeşitli şekillerde saklayabilirsiniz (merkezi git repo, paylaşılan sürücü, bulut depolama ...) ve yerel olarak hangi içeriğe sahip olmak istediğinizi kontrol edebilirsiniz.

Git-ekinin nasıl çalıştığını yanlış anladın mı? git-annex, yönettiği tüm dosyalar için tam geçmişe sahip - yerel olarak hangi dosya içeriğine sahip olmak istediğinizi seçmenize izin veriyor.

Sonunda, sorularınız hakkında:

Git'i, geçmişini almak istediğiniz birçok ikili dosyayı içeren büyük depolarla kullanmak için iyi bir uygulama nedir?

Deneyimlerime göre, seçenekler genellikle:

  • depodaki ikili dosyalara duyulan ihtiyaçtan kaçınmak (talep üzerine üretmek, başka yerde depolamak)
  • git-ek (veya Git LFS gibi benzer bir çözüm) kullanın
  • büyük bir repo ile yaşayın (tüm git işlemleri büyük dosyalardan etkilenmez ve hızlı bir bilgisayarınız ve sürücünüz varsa, oldukça kullanışlı olabilir)

Sığ klonlama normal bir çalışma şekli olarak kullanılabilir mi, yoksa "kesmek" mi?

Bu yapılabilir olabilir; ancak bunun probleminizi çözeceğini sanmıyorum:

  • tarihin hızlı araştırılması gibi, geçmişin tam tarihine sahip olmasından kaynaklanan yararlarını kaybedersiniz
  • birleşmeler zorlaşabilir, çünkü AKAIK, en azından birleşme için şubeye kadar geçmişe sahip olmalısınız.
  • kullanıcıların klonlarının boyutunu küçük tutmak için periyodik olarak yeniden klonlamaları gerekir
  • git'i kullanmanın alışılmadık bir yoludur, bu nedenle muhtemelen birçok araçla sorun yaşarsınız.

Git deposu (tesis içi) için "çok büyük" ne kadar büyük? 4GB'a indirebilirsek değişmekten kaçınmalı mıyız? 2GB?

Bu, deponun yapısına (birkaç / çok sayıda dosya vb.), Ne yapmak istediğinize, bilgisayarınızın ne kadar becerikli olduğuna ve sabrınıza bağlıdır.

Size hızlı bir fikir vermek için: (Yeni, fakat düşük özellikli) dizüstü bilgisayarımda 500 MB'lık bir dosya işlemek 30-60 saniye sürüyor. Yalnızca tarihçeyi listelemek (git günlüğü vb.) Büyük dosyalardan etkilenmez; dosya içeriğini taraması gereken "git log -S" gibi şeyler çok yavaştır - ancak, hız esas olarak G / Ç tarafından yönetilir, bu yüzden gerçekten git'in hatası değildir.

Bir avuç revizyon içeren 3 GB'lık bir depoda "git log -S" yaklaşık bir dakika sürer.

Bu yüzden birkaç GB iyi olsa da, ideal olmasa da söyleyebilirim. Muhtemelen 10-20 GB’dan fazla baskı yapıyor, ancak yapılabiliyor olabilir - denemek zorundasın.


Detaylı cevabınız için teşekkürler. Test belgeleri için ek kullanmaya kesinlikle bakacağım. "Makul performans" çıtası muhtemelen "svn'ye yakın" dır, yani herhangi bir işlem için çok daha yavaş ise, geçiş yapmak için çok fazla sürtünme olacaktır.
Anders Forsgren

Git LFS'nin büyük ikili dosya depolaması için de kullanılabileceğini düşünüyorum.
IgorGanapolsky 21:16

@İgorG .: Evet, Git LFS alternatif, diğerleri de var. Gösterdiğin için teşekkürler, yazımı düzenledim.
sleske

4

Kullanıcı sayısı arttıkça, bagajda çok fazla kayıp var ve özellikler kod incelemesini zorlaştıracak şekilde birçok komisyona yayılıyor. Ayrıca dallanma olmadan kötü kodları "kapıya sokmanın" bir yolu yoktur, yorumlar ancak bagaja bağlanmasından sonra yapılabilir.

Git'e gitmek bu sorunları çözmez, aracı nasıl kullandığınızla ilgilidir ve aynı şekilde kullanırsanız sorunlar devam edecektir.

Svn'de git kadar kolay dallanabilirsiniz ve birleşme genellikle aynı derecede kolaydır ve aynı tuzaklar vardır. Git, çekirdek kaynak koduyla çalışmak üzere tasarlandı, bu nedenle, büyük ikili dosyalara ve büyük geçmişlere sahip olan sizinki gibi her durumda geçerli olmayabilecek bazı varsayımlar yaptı. Bir DVCS'nin arkasındaki amaç, her kullanıcının etkili bir şekilde tek başına çalışması ve yalnızca daha sonra işbirliği yapmasıdır - yani kendi repolarına (kopyalarına) sahip olmak, istedikleri gibi çalışmak ve sonra değişiklikleri, isteyen herkese itmek. Linux çekirdeği gelişiminde kullanılan bir federasyon sistemi bunun için mükemmeldir - değişikliklerinizi, kod tabanı ile birleştiren zincirdeki bir sonraki adama zorlarsınız ve sonra onu serbest bırakan Linus'a gelene kadar bir sonraki adama zorlarsınız. Takımların çoğu benzer şekilde git kullanır, ancak genellikle sunucu tarafında 'altın' deposu olan yalnızca 1 yukarı akış adamla,

Bu yüzden önce iş akışınızı değiştirmeye bakacağım, sadece daha iyi bir çalışma yönteminiz olduğunda git'e geçeceksiniz. SVN'de dallanma ve birleştirme uygulayın, dosyaları veya dizinleri yeniden adlandırmazsanız birleştirme oldukça iyi gidiyor.


4
"Svn'de git kadar kolay bir şekilde dallanabilirsiniz ve birleştirme genellikle aynı derecede kolay ve aynı tuzaklara sahiptir", vay bu gerçekten tartışmalı bir iddia. Git'e göre bence bir esinti ve svn'de genellikle bir kabus, hatta birleşme takibinde yarı-pişmiş bir girişimin yapılmasından sonraki versiyonlarda bile (evet, sadece bu depoda değil, git ile çalışıyorum). Sahip olmak istediğimiz iş akışı , bir özellik dalı oluşturduğunuz, bu bölümde kod incelemesi / CI oluşturduğunuz bir akış . Bunu SVN'de büyük bir hayal kırıklığı olmadan yapmanın bir yolu yok.
Anders Forsgren

2
hayır, biz her zaman burada yaparız. Hangisinin silinebileceğini görmek için SVN depomdaki 157 şubeden geçiyorum. Burada hemen hemen günlük olarak dallanma, geliştirme, inceleme ve birleştirme yapıyoruz, zaman zaman başımız derde giriyor ancak bu durum her zaman yeni bir dalın bagajdan alınması ve değişikliklerin bununla birleştirilmesiyle düzeltiliyor (böylece daha sonra tekrar bagaja kolayca birleştirilebilir) . Bu sadece gerçekten eski dallar için de geçerlidir. Eğer büyük bir hayal kırıklığınız varsa, yeterince iyi anlamıyorsunuzdur. Git, ayrıca size büyük hayal kırıklıkları verecektir.
gbjbaanb

2
Sadece deneyimlemiyorum. Git ile çalışırken (dediğim gibi, ancak daha küçük depolarda) dallanma, yeniden doğuş, ezme ve birleştirme özelliklerinin yapılmasının oldukça kolay ve doğal olduğunu düşünüyorum. "Yeniden adlandırdıktan sonra ağaç çakışması" vb. Çok daha nadir görülür ve doğrusal ve basit bir tarihi taklit edebilmeniz (rebase + squash vb.) Çok önemlidir. Öyleyse: soruyu konuyla ilgili olarak tutmak için (büyük repolarla git): svn'nin ihtiyaç duyduğum iş akışını desteklemediğini varsayalım ve git de var.
Anders Forsgren

1
Daha önceki bir şirkette git'i kullandık ve orada düzenli olarak işini kullanarak işini kaybeden birini tanıyorum, bu yüzden hiçbir şekilde mükemmel bir sistem değil! SVN de değildir, ancak SVN koşullarınız için git IMHO'dan daha iyi bir seçimdir ve işe yarıyor. On-konu, git'in istediğin gibi çalışmasını sağlamak ... Gerçekten olacağından emin değilim, üzgünüm.
gbjbaanb

7
@gbjbaanb eğer birisi Git ile olan çalışmalarını kaybediyorsa , çok yanlış bir şey yapıyorlar.
RubberDuck

2

GCC posta listesine bakınız. Geçirme GCC GCC tarihini tutarken GIT SVN derleyici'nın kaynak ağacını, şu anda (Ağustos & Eylül 2015) tartışılmaktadır. Örneğin bkz dönüştürme amaçlı depo ve git dönüşüm için kabul kriterlerine posta iplikleri; dönüşümle ilgili araçlara ve prosedürlere referanslar bulacaksınız (bu göründüğü kadar kolay değildir; bu kadar büyük bir kod taban geçmişinin dönüştürülmesi 36 saat ve yaklaşık 64 Gbay RAM, IIRC gerektirir)


SVN'den Git'e mi demek istediniz? Sürüm kontrol sisteminden bir derleyici paketine geçiş yapmak biraz tuhaf görünüyor. Ayrıca, bu bir cevaptan çok bir yorum gibi biraz daha okur.
8bittree

Evet. Yazım hatası için özür dilerim.
Basile Starynkevitch

Teşekkürler. 36 saat esinti gibi geliyor, bizimki birkaç hafta içinde dönüştürebilir ...
Anders Forsgren

2

Tüm SVN deposunu Git'e dönüştürürseniz, klonlamak için uygun olmayan büyük bir depoya neden olursanız, Subversion deponuzun belirli kısımları için daha küçük Git aynaları oluşturmak için SubGit'i kullanmayı deneyebilirsiniz .

Örneğin, SVN deponuzun alt dizinini içe aktarabilir ve senkronize edebilirsiniz http://domain/repos/trunk/project/src:

subgit configure --layout auto --trunk trunk/project/src http://domain/repos project.git
edit project.git/subgit/config
edit project.git/subgit/authors.txt
subgit install project.git

SubGit'i kullanma hakkında daha fazla ayrıntı için belgelerine bakın .

Git bu dizinin aynasını alır almaz, hemen SVN deposuna yansıyan yeni değişiklikleri göndermek için Git deposunu kullanabilirsiniz. SVN deposunun yalnızca belirli bir bölümünü, dönüştürülen Git deposunun boyutunu önemli ölçüde daraltan eşzamanladığınızdan ve hala dallar oluşturabildiğinizden, birleştirebilirsiniz, Git tarafındaki tüm iş akışlarını kullanın.

Alternatif olarak, tüm SVN deposunu içe aktarabilir, ancak büyük dosyaları senkronizasyondan hariç tutabilirsiniz:

subgit configure --layout auto --trunk trunk http://domain/repos project.git
edit project.git/subgit/config
...
[svn]
    excludePath = *.bin
    excludePath = *.iso
...
edit project.git/subgit/authors.txt
subgit install project.git

Sonuçlanan Git deposu makul boyutta olmalıdır ve geliştiriciler değişikliklerini Subversion deposuna göndermek için Git'i kullanabilir.

Subversion sunucusunu çalışır halde tutmaya ve SVN deponuzun yanında Git'i kullanmaya hazırsanız bu çözümün sizin için iyi çalışması gerektiğini unutmayın.

Yasal Uyarı: Ben SubGit geliştiricilerinden biriyim; SubGit bir dizi ücretsiz seçeneği olan ticari bir yazılımdır.


1

Durumunuza şu şekilde yaklaşacağım:

1) SVN deponuzla aynı dizinde bir git havuzu başlatın. Yapın git initve git remote add origino git repo'yu başlatmak için. Bu şekilde, siz hazır olana kadar birinden diğerine tam bir dönüşümle uğraşmadan SVN ve git'i ayrı ayrı taahhüt etmeye devam edebilirsiniz.

2) Git deponuzu denemek ve daraltmak için bfg ve filter-dalı araçlarını aktif olarak kullanın , burada belirtildiği gibi: https://confluence.atlassian.com/bitbucket/reduce-repository-size-321848262.html

3) Büyük ikili dosyalarınız için git-ek, Git LFS veya yalnızca harici bir depolama sunucusu kullanın (dosyaları derleme sırasında kabuk komut dosyaları kullanarak taşıma).

4) Git deponuzdaki birleştirme / dallanma stratejisinde rahat olduğunuzda ve git reponuzun boyutunda rahat olduğunuzda, svn'nizden Git'e tam bir geçiş yapabilirsiniz.

Bu yardımcı olur umarım.

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.