Jak mogę mieć połączone zależności w repozytorium git?

149

W moich skryptach często korzystam z bibliotek (moich lub innych), które mają własne repozytoria. Nie chcę powielać tych w moim repozytorium i utknąć w aktualizowaniu ich za każdym razem, gdy pojawi się nowa wersja. Jednak gdy ktoś sklonuje repozytorium, powinno ono nadal działać lokalnie i nie mieć zepsutych linków.

Jakieś pomysły na temat tego, co mógłbym zrobić?

Lea Verou
źródło

Odpowiedzi:

212

Możesz to zrobić za pomocą modułów podrzędnych w git. W swoim repozytorium wykonaj:

git submodule add path_to_repo path_where_you_want_it

Tak więc, jeśli repozytorium biblioteki miało adres URL git://github.com/example/some_lib.giti chciałeś go mieć lib/some_libw swoim projekcie, wpisz:

git submodule add git://github.com/example/some_lib.git lib/some_lib

Zauważ, że należy to zrobić z katalogu najwyższego poziomu w repozytorium. Więc nie rób tegocd wchodź do katalogu, w którym umieszczasz go jako pierwszy.

Po dodaniu modułu podrzędnego lub za każdym razem, gdy ktoś dokona zakupu nowego repozytorium, musisz wykonać:

git submodule init
git submodule update

Następnie wszystkie dodane moduły podrzędne zostaną pobrane w tej samej wersji, którą masz.

Jeśli chcesz zaktualizować jedną z bibliotek do nowszej wersji, cddo modułu podrzędnego i ściągnij:

cd lib/some_lib
git pull

Następnie, kiedy to zrobisz git status, powinieneś zobaczyć lib/someliblistę w zmodyfikowanej sekcji. Dodaj ten plik, zatwierdź i jesteś na bieżąco. Kiedy współpracownik pobierze to zatwierdzenie do swojego repozytorium, będzie widoczny lib/somelibjako zmodyfikowany, dopóki nie zostanie git submodule updateponownie uruchomiony .

Emilia
źródło
2
Dziękuję za odpowiedź, za głosem! (i prawdopodobnie przyjmie to jutro) Czy istnieje sposób na dodanie tylko jednego pliku z drugiego repozytorium jako zależności? A może musi to być cały folder?
Lea Verou
2
Jeśli chcesz śledzić go jako podmoduł (a tym samym mieć możliwość łatwego pobierania aktualizacji), będziesz musiał pobrać całe repozytorium. W przeciwieństwie do wielu innych systemów VCS, git tak naprawdę chce zajmować się tylko repozytorium najwyższego poziomu.
Emily,
7
przeczytaj to, aby dowiedzieć się, do czego służy podmoduł i jak obejść potencjalne problemy. i dyskusję na ten temat .
minghua
1
pozwala powiedzieć, że importujesz jako moduł podrzędny inne posiadane repozytorium. Czy możesz wprowadzić zmiany w oryginalnym repozytorium za pomocą lokalnych zmian w module podrzędnym? Powiedzmy, że znalazłeś błąd i chcesz zaktualizować oryginał?
andrevenancio
3
Wiem, że to stara odpowiedź, ale podmoduły git można aktualizować za pomocą. git submodule update --remoteZalecam używanie większej liczby flag, chociaż w przypadku bardziej złożonych projektów. Używamgit submodule update --remote --recursive --init
Chris