2012-12-12 11 views
18

Mam repozytorium git z submodule git wewnątrz. Moduł podrzędny jest hostowany na bitbucket. Chcę zaktualizować moją lokalną kopię modułu częściowego do ostatniego zatwierdzenia. Zmęczony "git submodule update" jednak to nic nie robi. Próbowałem więc usunąć folder submodule, a następnie wykonałem "git submodule init" Jednak po prostu pobiera początkowy commit modułu, a nie najnowszy.git submodule init nie ciągnie najnowszego commit

W jaki sposób mogę uzyskać mój lokalny moduł do aktualizacji do najnowszego zatwierdzenia?

Odpowiedz

26

Git robi dokładnie to, co powinien. git submodule update ustawi Twój moduł podrzędny na to, co bieżące zatwierdzenie w repozytorium głównym określa, w którym module powinien znajdować się moduł podrzędny. W ten sposób możesz wyewidencjonować inną gałąź, starsze zatwierdzenie lub tag, a następnie uruchomić git submodule update, a moduł podrzędny będzie ustawiony na to, czego oczekuje referencja, więc całe twoje rozwiązanie będzie miało zależności zależne.

Co trzeba zrobić, to:

cd mysubmoduledir 
git fetch 
git checkout master # or any other branch that you need the latest of 
git merge origin/master 
cd - # go back to the top repo 
git status # should show that your submodule changed 
git add mysubmoduledir 
git commit -m "Updated my solution to use latest sub project." 

krótsza wersja jest:

cd mysubmoduledir 
git pull # assumes you are already on the branch you need to be on 
cd - 
git commit -am "Updated submodule" # assumes you had no other modified files 

Słowo "zmiana" nie jest najlepszy dla tego polecenia submodule. To naprawdę oznacza "wskaż moduł częściowy do zatwierdzenia, którego oczekuje zatwierdzenie repozytorium macierzystego".

Aktualizacja modułu do innego zatwierdzenia (nie musi być najnowszym) wymaga, abyś przeszedł do tego katalogu, manipuluj nim jak zwykłym repozytorium git, aby bieżący commit był tym, czego potrzebujesz, a następnie wróć i Zatwierdź tę zmianę w repozytorium najwyższego poziomu.

+0

Co za idiotyczne imię dla polecenia ?! To oczywiście powinno być git submodule etadpu –

+0

Myślenie o tym "module submodule ilikepancakes" prawdopodobnie miałoby taki sam sens. A jeśli ktoś się z tym nie zgadza, przeczytaj mądrą prezentację o projekcie przestrzeni jądra apis: http://man7.org/conf/lca2013/Why_kernel_space_sucks-2013-02-01-printable.pdf –

+0

Więcej szczegółów na temat używania modułu 'git submodule ': https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ –

5

Każde zatwierdzenie git, które zawiera moduł częściowy, wiąże się z określonym zatwierdzeniem w repozytorium modułów.

Polecenie służy do aktualizacji sprawdzonej wersji modułu podrzędnego do zatwierdzenia zapisanego dla bieżącej wersji repozytorium macierzystego. Może to być w rzeczywistości starsza wersja niż obecnie wyewidencjonowana w tym module, na przykład w przypadku sprawdzania starej wersji nadrzędnego repozytorium, która korzystała ze starszej wersji modułu.

Aby uzyskać nowszą wersję modułu podrzędnego, należy przełączyć się do tego katalogu i zaktualizować go tak, jak w przypadku dowolnego innego repozytorium git (np. Pobrać z repozytorium wyższego poziomu). Jeśli wprowadzisz nowe zatwierdzenia lub pobierzesz z repozytorium innego niż to, którego używasz jako źródła modułu, pamiętaj o wypchnięciu zmian. Po wykonaniu tej czynności można powrócić do repozytorium nadrzędnego i zatwierdzić zmianę w module podległym w celu zarejestrowania nowego zatwierdzenia modułu modułów, którego teraz używasz dla modułu częściowego w bieżącej wersji, a także przyszłych wersji, dopóki nie wprowadzisz kolejnej aktualizacji.

2

Po prostu spróbuj poniżej polecenia po dodaniu swoich submodułów.

dla git v 1.8.x

git submodule update --init --recursive --remote 

dla v1.7.x:

git submodule update --init --recursive lub git pull --recurse-submodules

do v1.6.x

git submodule foreach git pull origin master 

sprawdzić wersję git.

git version