Grupowanie wielu repozytoriów Git, które są częścią tego samego ogólnego projektu

14

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?

użytkownik1203054
źródło
Czy te komponenty faktycznie zależą od siebie, na przykład związek między zwalnianym komponentem a biblioteką? A może po prostu próbujesz zsynchronizować wszystkie uwalniane komponenty?
Bezużyteczne
Oto starsza dyskusja na temat StackOverflow (cudem jeszcze nie zamknięta).
Dan Dascalescu,

Odpowiedzi:

6

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 .

Jonathan Eunice
źródło
1
Odwiedzając ponownie w 2016 r .: Dokumenty Hg nadal nazywają subrepos funkcją ostateczności . Dokumenty Git są bardziej entuzjastyczne, a funkcja submodułu jest teraz bardziej zintegrowana. Zarówno teraz również obsługiwać zagnieżdżone repo dobrze (uznając zagnieżdżony repo „ma piłkę” z plikami to zarządzających), co daje kolejną użyteczną opcję sub-repo. Jednak narzędzia DVCS są nadal ważne w repozytoriach jednopoziomowych, więc ostrzeżenia „sub-repos => zarządzanie wieloma poziomami” i „smoki tu są” pozostają aktualne.
Jonathan Eunice
2

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.

Wilbert
źródło
2

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.

w jaki sposób można „połączyć” te repozytoria, aby wiedzieć, że wersja 2.0 aplikacji wymaga wersji 1.5 komponentu serwera itp.?

Zazwyczaj jest to domena niektórych ram zarządzania zależnościami (np. Gradle, Maven), a nie sama Git.

paranoid_android
źródło