2009-10-20 15 views
37

W moim projekcie potrzebuję użyć kodu strony trzeciej, przechowywanego w kilku repozytoriach Git. Mój projekt jest również przechowywany w (oddzielnym) repozytorium Git. W głównym projekcie pracuje ze mną kilka osób, a ja jestem opiekunem.Git submodules workflow

We wcześniejszych projektach kopiowałem zależności ręcznie do drzewa roboczego Git, dodając niewielki plik określający wersję, której używam.

Teraz jest to dość niewygodne, ponieważ muszę codziennie aktualizować jedną z zależności i często wnosić do niej kod, w większości przypadków w połączeniu ze zmianami w głównym projekcie.

Postanowiłem wypróbować podmoduły Git w celu zarządzania. Im więcej ich próbuję, tym bardziej jestem sfrustrowany. Wydaje się nawet, że ręczna kopia jest być może lepsza.

Oto niektóre z moich obaw:

  • Jesteśmy już w stanie uzyskać spójnego stanu repozytorium za pomocą jednego polecenia (git checkout teraz potrzebuje git submodule update --init).
  • Nie jesteśmy w stanie prawidłowo używać niektórych narzędzi Git (git archive jest najbardziej zauważalny).
  • Nie jesteśmy w stanie zobaczyć zmian stanu/różnic w submodułach z głównego projektu.
  • Jak już znalazłem w trudny sposób, git submodule nie działa z opcjami --git-dir i --work-tree i wymaga fizycznej zmiany katalogu bieżącego do "poziomu roboczego drzewa".

Wygląda na to, że aby usprawnić nasz proces pracy podmodułów (czyli jedną operację == jedno polecenie), musimy napisać dość grube opakowanie wokół Gita. To jest smutne.

Należy zauważyć, że nie jest opcją odejście od Git lub scalenie projektu podprojektu w całości z głównym projektem.

Być może używam git submodules w niewłaściwy sposób? Czy istnieje jakiś dobry samouczek dotyczący przepływu pracy?

Proszę mówić, nawet jeśli nie znasz właściwej odpowiedzi, ale podziel się moimi obawami. :-)

+6

Jeden z moich ulubionym Submoduły pułapek jest, jeśli usunąć submodule i zastąpić go nowym modułem w tym samym miejscu, to łamie repozytorium dla każdego innego. (np. Ktoś podaje bibliotekę na githubie, a zamiast tego zmienia moduł częściowy na punkt na widelcu). Obejście problemu polega na usunięciu modułu częściowego, zmobilizowaniu wszystkich i aktualizacji, a następnie zastąpieniu modułu częściowego i umożliwieniu każdemu ciągnięcia i ponownej aktualizacji. –

+0

Myślałem, że ktoś ukradł ten post i opublikował go na habr bez odniesienia, ale wtedy spojrzałem na nazwę ... :-D Mimo to, odniesienie do SO byłoby miłe, jak sądzę. –

+1

Jest jeden.Przyjrzyj się bliżej linkom w tekście. –

Odpowiedz

11

Zamiast tego możesz spróbować użyć git subtree (alt link). Miałem w tym dużo szczęścia, używając w moim projekcie zarówno odległych repozytoriów, jak i czystych (odwiązanych do master) gałęzi.

+1

Próbowałem gt subtree, i jest znacznie lepszy od submodułów git dla moich zadań. Dzięki! –

+0

Pierwsze łącze jest zepsute. Wiem, że podasz link alternatywny. Ale chciałem ci tylko powiedzieć. – Eduardo

+0

@EduardoCereto - oba łącza działają bez zarzutu. – FooF