Edycja: w przeciwieństwie do niektórych podobnych pytań, takich jak Przenoszenie repozytorium SVN z wieloma GB do Git lub /programming/540535/managing-large-binary-files-with-git Mój scenariusz nie obejmuje kilku podprojektów, które można łatwo przekonwertować na submoduły git, a także kilka bardzo dużych plików binarnych, które dobrze nadają się do załącznika git. Jest to pojedyncze repozytorium, w którym pliki binarne są zestawem testowym ściśle powiązanym z głównym kodem źródłowym tej samej wersji, podobnie jak gdyby były to zasoby czasu kompilacji, takie jak grafika.
Badam zmianę starego repozytorium kodu z svn na średnie / duże rozmiary (50 użytkowników, 60 000 wersji, historia 80 Gb, kopia robocza 2 Gb). Wraz ze wzrostem liczby użytkowników występuje duże opóźnienie w przesyłaniu danych, a funkcje są często rozkładane na wiele zatwierdzeń, co utrudnia przegląd kodu. Również bez rozgałęzienia nie ma możliwości „zejścia” złego kodu, przeglądy można wykonać dopiero po jego przypisaniu do pnia. Badam alternatywy. Miałem nadzieję, że możemy przejść do git, ale mam pewne problemy.
Problem z obecnym repo w zakresie git dotyczy rozmiaru. Jest tam wiele starych cruftów, a czyszczenie go za pomocą --filter-branch podczas konwersji na git może zmniejszyć jego rozmiar o rząd wielkości, do około 5-10 GB. To wciąż jest za duże. Największym powodem dużego rozmiaru repozytorium jest to, że do testów wchodzi wiele dokumentów binarnych. Pliki te różnią się między .5mb a 30mb, a są ich setki. Mają też sporo zmian. Patrzyłem na podmoduły, git-aneks itp., Ale posiadanie testów w podmodule wydaje się błędne, podobnie jak posiadanie załącznika do wielu plików, dla których chcesz mieć pełną historię.
Tak więc rozproszony charakter git jest naprawdę tym, co powstrzymuje mnie przed przyjęciem go. Tak naprawdę nie dbam o dystrybucję, chcę tylko tanie rozgałęzienia i potężne funkcje łączenia. Tak jak zakładam, że robi to 99,9% użytkowników git, użyjemy błogosławionego, czystego centralnego repozytorium.
Nie jestem pewien, czy rozumiem, dlaczego każdy użytkownik musi mieć pełną historię lokalną podczas korzystania z git? Jeśli przepływ pracy nie jest zdecentralizowany, co te dane robią na dyskach użytkowników? Wiem, że w najnowszych wersjach git możesz używać płytkiego klona z najnowszą historią. Moje pytanie brzmi: czy jest to wykonalne jako standardowy tryb działania dla całego zespołu? Czy git może być skonfigurowany tak, aby zawsze był płytki, abyś mógł mieć pełną historię tylko centralnie, ale użytkownicy domyślnie mają tylko 1000 obrotów historii? Opcją jest oczywiście konwersja 1000 obrotów na git i zachowanie repozytorium svn dla archeologii. W tym scenariuszu ponownie napotkalibyśmy ten sam problem po kolejnych kilku tysiącach poprawek dokumentów testowych.
- Co to jest dobry najlepszych praktyk za korzystanie z dużymi repo git zawierających wiele plików binarnych, które nie chcą historię? Większość najlepszych praktyk i samouczków wydaje się unikać tego przypadku. Rozwiązują problem kilku ogromnych plików binarnych lub proponują całkowite ich usunięcie.
- Czy płytkie klonowanie jest użyteczne jako normalny tryb działania, czy też jest to „hack”?
- Czy można zastosować podmoduły w kodzie, w którym istnieje ścisła zależność między główną wersją źródłową a wersją podmodułu (na przykład w zależnościach binarnych w czasie kompilacji lub pakiecie testów jednostkowych)?
- Jak duży jest „zbyt duży” dla repozytorium git (lokalnie)? Czy powinniśmy unikać zmiany, jeśli uda nam się obniżyć ją do 4 GB? 2 GB?