Załóżmy, że mam projekt, który ma wiele komponentów: komponent serwera, komponent aplikacji internetowej, komponent iOS, komponent Android itp. Te komponenty są oddzielnymi bazami kodów, ale są również luźno powiązane (np. Zmiana na serwerze kod może również wymagać zmiany we wszystkich innych komponentach)
Jaki jest najbardziej efektywny sposób organizacji tego projektu w Git? Jeśli umieścisz to wszystko w jednym repozytorium, zawsze będziesz mieć najnowsze wersje, ale sprawy staną się dość niechlujne, gdy zaczniesz zmieniać jeden składnik, a nie inne.
Z drugiej strony, jeśli utworzysz każdy komponent jako osobne repozytorium, w jaki sposób możesz „połączyć” te repozytoria, aby wiedzieć, że wersja 2.0 aplikacji wymaga wersji 1.5 komponentu serwera itp.?
Czy w git jest jakaś funkcja poza aktualizowaniem readmesów (lub jakiegoś lepszego rozwiązania, którego nie widzę), aby efektywniej zarządzać wieloma powiązanymi repozytoriami?
Odpowiedzi:
Podprojekty to miejsce, w którym rozproszone systemy kontroli wersji (DVCS) zaczynają, jeśli nie rozwikłać, z pewnością stają się trochę dziwne.
Zarówno podmoduły Git, jak i podskładniki Mercurial mają na celu wsparcie podprojektów. Oba zostały ulepszone w kolejnych wersjach (do tego stopnia, że stara funkcja Mercurial „ta funkcja istnieje, ale prawdopodobnie nie należy jej używać” ostrzeżenie nie jest już na pierwszym planie).
Mimo to repozytoria wieloprojektowe pozostają raczej specjalnym przypadkiem użycia niż funkcją „wszyscy używają”. Dokumentacja zawiera liczne zastrzeżenia i instrukcje „jak korzystać z tych”, które jasno pokazują, że zarządzanie „projektami projektów” jest problemem dwupoziomowym, przy czym zarządzanie meta nieznacznie, ale naprawdę różni się od bezpośredniego zarządzania projektami na jednym poziomie. W rezultacie istnieje znacznie mniej doświadczenia. Nie brakuje też „nie używaj submodułów git!” i „unikaj podskórnych podskórnych!” komentarze i posty na blogu.
Moje własne doświadczenia z subrepos były mieszane. Działało ... ale było też denerwujące. Uwielbiam pomysł na podprojekty, ale w praktyce znajduję alternatywy - duże repozytorium typu all-in-one lub projekty towarzyszące - łatwiejsze do sprowadzenia (choć mniej eleganckie). Z niecierpliwością czekam na dzień, w którym subrepos są głównym nurtem, a nie bólem, ale jeszcze tego nie doświadczyłem.
Nie oznacza to, że zarządzanie podmodułami / podrepami nie będzie dla ciebie działać, ale jest to coś, co należy zrobić ostrożnie, a na pewno wcześniejszych eksperymentów i planowania.
Ponieważ koncentrujesz się na Git, powinieneś także zbadać poddrzewa Git, które dla niektórych są lepszą alternatywą dla podmodułów git .
źródło
Jeśli używasz C #, możesz użyć NuGet.
Ustaw każdy komponent w bibliotekę i przechowuj go we własnym repozytorium. Twórz wersje podstawowych komponentów, które aktualizujesz zgodnie z wersją semantyczną.
Na koniec poproś serwer budujący, aby spakował biblioteki do pakietów NuGet i wykorzystał te pakiety NuGet w projektach dla komponentów frontonu (iOS, Android).
To samo podstawowe podejście (zależności wersji i pakietu) może być również używane w innych językach, ale może nie być tak wygodne.
Nie polecam ci używania Git Submodules. Chociaż teoretycznie można go stosować do tego rodzaju problemów, wydaje mi się, że jest to większy problem niż wart.
źródło
Moim zdaniem będzie to zależeć od tego, ile faktycznie są ze sobą powiązane. Naprawdę miło jest móc uruchomić automatyczne
git bisect
śledzenie regresji, ale będzie to trudne, jeśli każde zatwierdzenie zależy od innej wersji innych zależności do uruchomienia.Dwie możliwe opcje to jedno repozytorium z podmodułami lub wiele repozytoriów z dobrymi praktykami wersjonowania.
Zazwyczaj jest to domena niektórych ram zarządzania zależnościami (np. Gradle, Maven), a nie sama Git.
źródło