2011-07-16 14 views
11

Mam kilka pracujących drzew z pewnymi zależnościami. AFAIK, git modułem wymusi następujące:Git submodule alternatywa?

  • mieć kopię każdego drzewa roboczego (Slave) w podkatalogu każdym drzewie roboczym używając go (master)
  • repozytorium mistrz powiela wszystkie informacje z niewolników

Nie mam nic przeciwko tym, że repo robi się większe, ale posiadanie kopii jest dla mnie nie do przyjęcia. Zmusiłoby mnie to do reorganizacji wszystkich projektów, aby kopia była połączona. Co więcej, edycja niewłaściwego pliku może łatwo doprowadzić do zamieszania.

Mam inny pomysł:

  • Each sklepów mistrzowskie listę wszystkich swoich niewolników.
  • Nie są wymagane żadne inne informacje w systemie głównym.
  • Przy każdym zatwierdzeniu w master, tworzone jest "snapshot-commit" w slave.
  • "Migawka-zatwierdzenie" jest migawką bieżącego stanu roboczego drzewa, ignoruje bieżący stan indeksu (używam już "migawki-zatwierdzenia" przed odrzuceniem niektórych niezamówionych zmian).
  • "Migawka-zatwierdzenia" zbiera się w oddziale, którego nazwa pochodzi od imienia i nazwiska głównego. Komunikat zatwierdzenia zawiera wartość mieszania głównego zatwierdzenia. (IMHO, to jest lepsze niż zalanie tysiącami tagów.)
  • Kasa działa jak zwykle, chyba że wymagana jest rekursja na niewolników.

Jedyny problem widzę są następujące:

  • W commity w niewolników będzie gromadzić i nigdy nie zostaną usunięte, nawet jeśli pan popełnia już nie istnieją.
  • Zobowiązania w systemie głównym nie zawierają się samodzielnie, można usunąć zatwierdzenie skierowane w systemie głównym. Ale nie widzę żadnej szansy, żeby to mogło się stać przypadkiem, więc mogę z tym żyć.
  • Nie mogę sobie wyobrazić, w jaki sposób inne polecenia git mogłyby to poprzeć. Ale znowu mogę z tym żyć.

Pytam, czy ktoś już to zaimplementował (lub jeśli to zły pomysł).

Odpowiedz

2

Nie jestem pewien, czy śledzę cię od momentu, gdy repozytorium dla rodziców (twój "mistrz") zawiera tylko odniesienie do ścisłego SHA1 modułu częściowego (sub-repo sprawdzone w ramach repozytorium macierzystego).
Nie ma to wpływu na wielkość repozytorium nadrzędnego.

Wartość subtree merge strategy (better managed though git subtree) zwiększyłaby rozmiar repozytorium nadrzędnego, ale ta (poddrzewo) nie jest tym, o czym mówisz.

Inną alternatywą dla submodułu byłaby wersja git-slave (gits), która jest nieco podobna do implementacji.

+0

Czy masz na myśli, że myliłem się z moim zdaniem "repozytorium master duplikuje wszystkie informacje od niewolników" ? Jest to całkiem możliwe, ale moim głównym zmartwieniem jest istnienie kopii każdego drzewa podrzędnego w każdym drzewie głównym (czy też znowu się mylę?). – maaartinus

+0

@maaartinus: istnieje kopia fizyczna (ponieważ kasuje pewną różnicę), ale cały repo nadrzędny zachowuje referencję do zatwierdzonego zatwierdzenia. Zobacz "prawdziwy charakter submodułów" tutaj: http://stackoverflow.com/questions/1979167/git-submodule-update/1979194#1979194 – VonC

+0

@maaartinus: Prawdą jest jednak, że każde nadrzędne zwierzenie repo będzie kasować submoduł, co oznacza w danym czasie będzie istnieć kilka kopii tego submodułu. – VonC

11

Myślę, że to zły pomysł, ponieważ jest dziwny i zabierze cię z obsługiwanej ścieżki dla wielu rzeczy.

Najpierw wyjaśnienie: Podczas korzystania z submodułów repozytorium "master" (referencyjne) nie staje się znacznie większe. Przechowuje tylko referencję do repozytorium (prawdopodobnie URL) i identyfikator zatwierdzenia. Ale to nie wydaje się być tutaj najważniejszą kwestią.

Gdy mamy do czynienia z problemem, jak to istnieją trzy zasadzie 3 ścieżki można zejść:

  1. umieścić wszystko w jednym repozytorium. Czy przekonałeś się 10 razy, że naprawdę musisz rozdzielić te rzeczy? Pamiętaj, że możesz zacząć od jednego repo i podzielić je później. Pamiętaj też, że git merges faktycznie działa, więc rywalizacja dewelopera nie jest tak dużym problemem.

  2. Użyj zewnętrznego systemu zarządzania pakietami. Git NIE jest i nie udaje, że jest menedżerem pakietów. Szanse są dobre, że platforma, której używasz, ma menedżera pakietów obsługującego bardziej złożone sytuacje zależności. Maven, rubygems, npm, nuget ... jest ich wiele.

  3. Użyj submodułów "zamontowanych" w podkatalogach.

Zasadniczo, podmoduły powinny być twoim ostatnim wyborem, gdy masz do czynienia z własnym kodem. Świetnie radzą sobie z bibliotekami stron trzecich, ale w końcu są królewskim bólem dla własnego kodu. Dodaj do tego skomplikowane rozwiązanie, które proponujesz, a po prostu nie będzie zabawnie pracować.

+0

Dziękuję za wyjaśnienia i za wszystkie porady. Obecnie robię wiele projektów zaćmieniowych, każdy z własnym repozytorium git. Zależności między nimi są na tyle słabe, aby to zadziałało, a to, co robię, rozwiąże jedyny pozostały problem: od czasu do czasu pojawia się pewna zmiana w referencyjnym repo, które wymaga zmian w referencyjnym. To sprawia, że ​​cofanie się w czasie na tak skomplikowanej granicy i to, czego szukam, może rozwiązać. Nie potrzebuję go często, więc wszelkie możliwe problemy również będą rzadkością. Montowane podmodulki mogą zrobić to, czego potrzebuję ... – maaartinus

+1

Po tym, co tam zrobiłem, naprawdę nie sądzę, że warto. Posiadanie zestawu submikuł jest jedną z tych rzeczy, które brzmią jak naprawdę ładny i elegancki pomysł (który jest), ale codzienne użytkowanie to tylko ból. Nie mogę cię zachęcić do rozpoczęcia pojedynczego repo. –

+1

Nie zgadzam się z @RussellMull i chciałbym zachęcić was, abyście nie umieszczali wszystkiego w jednym repo. Łączenie zbyt wielu rzeczy w jednym repozytorium to marne doświadczenie, nawet w moich własnych projektach, w których jestem jedynym, który nad nim pracuje. Submodules nie są świetne do tego typu rzeczy, ale są znacznie lepsze niż łączenie niespokrewnionych projektów razem w jednym reporze git. –

Powiązane problemy