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?


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.


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.



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