Jak skonfigurować projekt git, aby korzystał z zewnętrznego submodułu repo?

213

Chciałbym utworzyć repozytorium, które pobiera repozytorium zdalne.

Na przykład powiedzmy jQuery jako submoduł:

git://github.com/jquery/jquery.git

Jaki byłby proces tworzenia repozytorium z jQuery jako podmodułem i dodawania własnego zewnętrznego jako zdalnego repo.

Czy po ustawieniu, jeśli popchnę / pociągnę do własnego pilota, czy zewnętrzny pozostanie nienaruszony?

Tomek
źródło
1
Kiedy mówisz „wciągnij”, czy mówisz, że chcesz, aby repozytorium jQuery było submodułem własnego repozytorium?
ezod
Tak dokładnie, przepraszam, jeśli nie jest to jasne. Chciałbym wiedzieć, jak skonfigurowałem to jako zewnętrzne, pchając i ciągnąc zmiany do mojego własnego pilota
Tom
Zobacz samouczek Git Submodule na git wiki.
Greg Bacon

Odpowiedzi:

343
  1. Masz projekt - nazwij go MyWebApp który ma już repozytorium github
  2. Chcesz użyć repozytorium jquery w swoim projekcie
  3. Chcesz pobrać repozytorium jquery do swojego projektu jako submoduł .

Submoduły są naprawdę bardzo łatwe do odniesienia i użycia. Zakładając, że masz już skonfigurowaną MyWebApp jako repozytorium, z terminala wydaj następujące polecenia:

cd MyWebApp
git submodule add git://github.com/jquery/jquery.git externals/jquery

Spowoduje to utworzenie katalogu o nazwie externals/jquery* i połączenie go z repozytorium jquery github. Teraz wystarczy zainicjować podmoduł i sklonować do niego kod:

git submodule update --init --recursive

Powinieneś teraz mieć cały najnowszy kod sklonowany w submodule. Jeśli repozytorium jquery się zmieni i chcesz ściągnąć najnowszy kod, po prostu wydajsubmodule update ponownie polecenie. Uwaga: zazwyczaj w moich projektach mam wiele zewnętrznych repozytoriów, dlatego zawsze grupuję te repozytoria w katalogu „zewnętrznym”.

Internetowa książka Pro Git Book zawiera kilka dobrych informacji na temat submodułów (i ogólnie git) przedstawionych w łatwy do odczytania sposób. Alternatywnie, git help submoduledaje również dobre informacje. Lub spójrz na samouczek Git Submodule na git wiki.

Zauważyłem ten wpis na blogu, który mówi o submodułach i porównuje je z mechanizmem svn: externals Subversion: http://speirs.org/blog/2009/5/11/understanding-git-submodules.html

* Najlepszą praktyką jest, aby zawsze umieszczać swoje moduły podrzędne w ich własnym katalogu, takim jak Zewnętrzne. Jeśli tego nie zrobisz, katalog główny projektu może stać się bardzo zagracony bardzo szybko.

memmons
źródło
4
Świetne wyjaśnienie! :) Także „git help submodules” pomaga, jeśli chcesz trochę więcej szczegółów, elementów wewnętrznych itp.
WhyNotHugo
2
Dzięki dokładnie tego, czego potrzebowałem.
MikeSchinkel,
1
@Chevi To zależy od twoich wymagań. Ogólnie rzecz biorąc, dodanie projektu git jako submodułu do twojego projektu jest dobrym rozwiązaniem dla projektów, które często się zmieniają lub są wciąż w fazie rozwoju. Pozwala to łatwo upewnić się, że cały kod innej firmy w twoim projekcie jest aktualny. W przypadku kodu innej firmy, który jest zasadniczo statyczny - stabilny, dojrzały kod, który prawdopodobnie nie zmieni się wiele z wersji na wersję - użycie submodułu nie zapewnia dużej wartości.
memmons
2
przepraszam, ale w porównaniu do zewnętrznych svn, to nie jest takie proste
Keil
2
@Keil To dwie komendy git submodule addi git submodule update... Nie jestem pewien, o ile łatwiej byłoby.
memmons,
24

Odpowiedzi na większość potrzebnych informacji zostały już udzielone, więc nie zawracam sobie głowy rozwiązywaniem tego problemu, jednak znalazłem małą informację, której zwykle brakuje.

Jak wiecie, „git pull” nie zaktualizuje submodułów, a „update git submodules” nie pobierze również najnowszej wersji HEAD tych submodułów.

Aby zaktualizować wszystkie swoje podmoduły do ​​ich najnowszej wersji, możesz użyć

git submodule foreach git pull

Jeśli często zmieniasz swoje podmoduły i masz ich dużo, wówczas „git foreach” stanie się nieoceniony.

WhyNotHugo
źródło
0

Myślę, że odpowiedź @ Hugo może być tym, czego potrzebujesz i działa dobrze. Więc znalazłem łatwiejszy sposób.

git submodule update --remote

To wszystko.

Tak więc pełny przepływ pracy może być:

git clone project-with-submodules
git submodule init
git config -l
git submodule update --remote
Dapaldo
źródło