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

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.


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.


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 .


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.



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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.