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ć?

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 .


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
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.