Zagnieżdżone repozytoria Git?

181

Czy mogę zagnieżdżać repozytoria Git? Mam:

 /project_root/
 /project_root/my_project
 /project_root/third_party_git_repository_used_by_my_project

Czy jest sens, aby aby ułatwić zarządzanie wszystkim lokalnie czy muszę zarządzać , a jedna ze stron 3-ty osobno?git init/add/project_rootmy_project

Jeremy Raymond
źródło

Odpowiedzi:

159

Być może szukasz funkcji Git zwanej submodułami . Ta funkcja pomaga zarządzać repozytoriami zależnymi zagnieżdżonymi w repozytorium głównym.

Greg Hewgill
źródło
43
Jako względną początkujących git, znalazłem ten blog / poradnik łatwiej zrozumieć chrisjean.com/2009/04/20/... Zajmuje prostsze podejście, skupiając się tylko na git zamiast kontekst skryptu pomocnika powłoki; Łatwiej mi było czytać.
John K,
4
Blog chrisjean.com nie wydaje się być aktualny, po prostu próbując go śledzić. Wpis Grega na wiki może być nieco bardziej skomplikowany, ale jako początkujący wolę dokładność niż proste ...
mędrzec
Blog wydaje się teraz działać dobrze i niestety dla szałwii, 34 (obecnie 35) głosów w górę w komentarzu wydaje się zgadzać, że w blogu jest pewna wartość. Okazuje się, że nie trzeba poświęcać dokładności, aby uzyskać jasność i porady dotyczące konkretnej operacji. Po przeczytaniu wyobrażam sobie, że autor już trochę przestudiował i prawdopodobnie przeczytał aktualną dokumentację Gita , a nie tylko stronę wiki kernel.org. Wyjaśnienie autora bloga w całkowicie kontekstowym przykładzie wydaje się być bardzo pomocne dla dużej liczby osób ...
Matthew Weber
13
BTW, że wspomniany wyżej link chrisjean jest martwy. Zaktualizowany link to chrisjean.com/git-submodules-adding-using-removing-and-updating
sprksh
35

Umieść biblioteki stron trzecich w oddzielnym repozytorium i użyj podmodułów, aby powiązać je z głównym projektem. Oto przewodnik:

http://git-scm.com/book/en/Git-Tools-Submodules

Decydując, jak podzielić segment repo, zwykle decydowałem na podstawie tego, jak często je modyfikowałem. Jeśli jest to biblioteka innej firmy i tylko zmiany, które wprowadzasz, aktualizują się do nowszej wersji, zdecydowanie powinieneś oddzielić ją od głównego projektu.

Igor Zevaka
źródło
22

Dla kompletności:

Jest jeszcze jedno rozwiązanie, polecam: scalanie poddrzewa .

W przeciwieństwie do podmodułów łatwiej jest utrzymać. Każde repozytorium utworzyłbyś w normalny sposób. Będąc w głównym repozytorium, chcesz scalić wzorzec (lub inną gałąź) innego repozytorium w katalogu głównego katalogu.

$ git remote add -f OtherRepository /path/to/that/repo
$ git merge -s ours --no-commit OtherRepository/master
$ git read-tree --prefix=AnyDirectoryToPutItIn/ -u OtherRepository/master
$ git commit -m "Merge OtherRepository project as our subdirectory"`

Następnie, aby przeciągnąć inne repozytorium do katalogu (w celu jego aktualizacji), użyj strategii scalania poddrzewa:

$ git pull -s subtree OtherRepository master

Używam tej metody od lat, działa :-)

Więcej informacji na temat tego sposobu, w tym porównania z modułami podrzędnymi, można znaleźć w tym dokumencie git howto .

Phil
źródło
Odwołanie scalania poddrzewa do księgi git już nie działa. Obecnie wydaje się, że jest to link: git-scm.com/book/en/v2/…
ericx
18

Możesz dodać

/project_root/third_party_git_repository_used_by_my_project

do

/project_root/.gitignore

co powinno zapobiec włączeniu zagnieżdżonego repozytorium do repozytorium nadrzędnego i można z nimi pracować niezależnie.

Ale: jeśli użytkownik uruchomi git clean -dfx w repozytorium nadrzędnym, usunie zignorowane zagnieżdżone repozytorium. Innym sposobem jest dowiązanie symboliczne do folderu i zignorowanie dowiązania symbolicznego. Jeśli następnie uruchomisz git clean, dowiązanie symboliczne zostanie usunięte, ale repozytorium „zagnieżdżone” pozostanie nienaruszone, ponieważ naprawdę znajduje się w innym miejscu.

mikkelbreum
źródło
5

Podsumowanie.

Czy mogę zagnieżdżać repozytoria git?

Tak. Jednak domyślnie git nie śledzi .gitfolderu zagnieżdżonego repozytorium. Git ma funkcje zaprojektowane do zarządzania zagnieżdżonymi repozytoriami (czytaj dalej).

Czy sensowne jest git init / add the / project_root, aby ułatwić zarządzanie wszystkim lokalnie, czy też muszę osobno zarządzać moim projektem i programem zewnętrznym?

Prawdopodobnie nie ma to sensu, ponieważ git ma funkcje zarządzania zagnieżdżonymi repozytoriami. Wbudowane funkcje Git do zarządzania zagnieżdżonymi repozytoriami to submodulei subtree.

Oto blog na ten temat, a tutaj jest SO pytanie, które obejmuje zalety i wady korzystania z każdego z nich.

lachy
źródło
2

Użyłbym jednego repozytorium na projekt. W ten sposób przeglądanie historii staje się łatwiejsze.

Sprawdziłbym również wersję używanej przeze mnie biblioteki stron trzecich w repozytorium używającego ją projektu.

gnud
źródło