Zoptymalizuj repozytorium git, zawierające duże pliki binarne

21

Nasz projekt ma około 11 GB, z czego 10 to dane binarne (obrazy .png). W konsekwencji operacja a git difflub git statuszajmuje więcej niż minutę. Na szczęście wszystkie pliki danych są podzielone na folder o cudownej nazwie data. Zadanie to „Unikaj kompresji, różnicowania i innych kosztownych operacji na plikach binarnych”.

  • Rozważano podział projektu na dwa repozytoria. Wtedy databyłoby repo zewnętrzny, który jest sprawdzany przez głównego kodu źródłowego repo. Zdecydowano, że narzut związany z utrzymywaniem synchronizacji repozytoriów będzie zbyt duży, szczególnie dla artystów, którzy pracują z plikami danych.

  • Mówiąc wprost, git te pliki są binarne , z wyjątkiem rozważanych plików z różnic , ale te wydają się tylko częściowym rozwiązaniem pytania.

Wydaje mi się, że atrybuty git są rozwiązaniem, ale jak? Czy może jest lepsza architektura niż monolityczne repo?

Vorac
źródło
1
Pierwsze duże pytanie dotyczy tego, jak ważne są te pliki danych. Czy twój program potrzebuje wszystkich dostępnych obrazów, aby zrobić coś pożytecznego, czy też może uciec od małego podzbioru podczas typowego programowania / testowania?
Ixrec,
@Ixrec, obrazy są w rzeczywistości ważniejsze niż kod źródłowy. Wszystkie muszą być obecne, a sumy kontrolne .png są zawsze sprawdzane pod kątem uszkodzonych plików.
Vorac
1
Dlaczego to pytanie nie dotyczy przepełnienia stosu? Pytanie wydaje się dokładnie do tego dostosowane.
spirc
@spirc to pytanie otacza granicę między „pomocą przy pomocy oprogramowania”, która jest na ten temat w SO, a „strategią kontroli wersji”, która jest tutaj na temat. Ponieważ nie pyta o to, które polecenie git wykonać, aby coś zrobić, nie jest to wyraźnie po stronie SO linii, więc głosowałem za pozostawieniem go tutaj otwartym.
@Snowman dzięki za odpowiedź. Który element listy na ten temat pasuje do tego? programmers.stackexchange.com/help/on-topic
spirc

Odpowiedzi:

18

Możesz użyć git-lfs lub podobnych narzędzi (git-fat, git-annex itp.). Te narzędzia w zasadzie zastępują pliki binarne w repozytorium małym plikiem tekstowym z skrótami i przechowują rzeczywiste dane binarne w sposób inny niż git - jak udział sieciowy.

Sprawia, że ​​różnice i wszystko są superszybkie, ponieważ porównywane są tylko skróty, i jest - przynajmniej dla git-lfs - przezroczyste dla użytkownika (po jednorazowej instalacji).

Afaik git-lfs jest obsługiwany przez github, gitlab, VisualStudio i jest open source.

kat0r
źródło
2
Czy próbowałeś wykorzystać git-lfsprojekt z wieloma gigabajtami zasobów w mieszanym zespole programistów / artystów? Chcę wiedzieć, czy ludzie używają git-lfs do projektów takich jak gry i animacje. Ponieważ jest jeszcze dość nowy w momencie pisania. Z mojego własnego doświadczenia, bariera wejścia do git dla mniej technicznych użytkowników jest już bardzo wysoka, więc posiadanie dodatkowej warstwy do zarządzania plikami na niej może być trudne dla ludzi, chyba że nie są już dobrze zaznajomieni z git.
ideasman42
Przepraszam tylko za około ~ 1 GB danych. Ale git-lfs nie powinien dodawać żadnych dodatkowych kroków dla użytkowników końcowych, powinien być całkowicie przejrzysty.
kat0r
Wydaje się, że jest to poprawna odpowiedź, jeśli podczas integracji pojawią się jakieś problemy, powiem tutaj. Czy więc procedura instalacji musi zostać wykonana tylko raz na serwerze, a nie na każdym komputerze klienckim?
Vorac,
Afaik, musisz również zainstalować dodatek do małego klienta, sprawdź stronę github. Ale powinno to być łatwe do wdrożenia z polityką grupy / prostsze niż jakakolwiek alternatywa.
kat0r
1

Użyj zarówno repozytoriów GIT, jak i SVN

Jeśli pliki binarne można oddzielić logicznie od źródła, możesz rozważyć użycie git dla plików tekstowych i nie DVCS, takich jak subversion dla plików binarnych.

Projekt, nad którym pracuję, robi to, ponieważ mamy wiele GB na skompilowane biblioteki (dla zależności OSX / Win32), które musimy zachować w wersji.


Z drugiej strony, jeśli masz nietechnicznych użytkowników, używanie dwóch systemów kontroli wersji może być problematyczne. Jednak jeśli artyści nie pracują nad kodem, możesz podać skrypt do wykonania aktualizacji, a oni mogą użyć subversion do zatwierdzenia zasobów binarnych.

Użyj SVN (z git svn)

Chociaż ta kompromis nie zawsze jest tak miły dla programistów, którzy są przyzwyczajeni do korzystania ze zwykłego git, możesz użyć SVN dla głównego repozytorium, a programiści mogą używać git svnnarzędzi.

To sprawia, że ​​jest to trochę więcej pracy dla programistów używających git, ale oznacza to dla wszystkich, którzy nie znają DVCS (lub ogólnie VCS) - mogą korzystać z prostego modelu SVN bez konieczności korzystania z wielu złożonych systemów kontroli wersji.


git-lfs też jest opcją, ale nie skorzystałem z niej, więc nie mogę powiedzieć, jak dobrze działa.

ideasman42
źródło