Zaktualizuj submoduł do najnowszego zatwierdzenia

269

Mam projekt A, który jest biblioteką i jest używany w projekcie B.

Oba projekty A i B mają osobne repozytorium na github ALE wewnątrz B mamy podmoduł A.

Edytowałem niektóre klasy w bibliotece, która znajduje się w repozytorium A, włączyłem zdalne repozytorium, więc biblioteka (repozytorium A) została zaktualizowana.

Te aktualizacje nie odzwierciedlają „odniesienia” (podmoduł), który podmoduł odnosi się do poprzedniego zatwierdzenia .... co powinienem zrobić, aby zaktualizować podmoduł na git?

gruby
źródło

Odpowiedzi:

358

Wejdź do katalogu submodułu:

cd projB/projA

Wyciągnij repozytorium z projektu A ( nie zaktualizuje statusu git twojego rodzica, projektu B):

git pull origin master

Wróć do katalogu głównego i sprawdź aktualizację:

cd ..
git status

Jeśli podmoduł był aktualizowany wcześniej, wyświetli się mniej więcej tak:

# Not currently on any branch.
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#       modified:   projB/projA (new commits)
#

Następnie zatwierdz aktualizację:

git add projB/projA
git commit -m "projA submodule updated"

AKTUALIZACJA

Jak zauważył @paul, od gita 1.8 możemy używać

git submodule update --remote --merge

aby zaktualizować submoduł do najnowszego zdalnego zatwierdzenia. W większości przypadków będzie to wygodne.

Kjuly
źródło
35
BTW, jeśli nie jesteś właścicielem submodułu, możesz to zrobić, git submodule updategdy ktoś inny zaktualizował projA (dostaniesz nowy identyfikator zatwierdzenia).
lipca 11
jestem właścicielem submodułu głównego repozytorium (proj A), ale jestem zleceniodawcą w proj B.
gruby,
@Kjuly Po zatwierdzeniu, w jaki sposób można go popchnąć do pilota? Czy to po prostu git push?
KR29
1
@ KR29 w prawo, a pełny cmd to git push <remote> <branch>np git push origin dev.
Kwietnia
2
git submodule updatedziała tylko bez flag, gdy wyciągnięto zatwierdzenie (w pro B), które aktualizuje odnośniki do danego podmodułu (proj A). Aby zaktualizować proj B, aby odwoływał się HEADdo gałęzi zdalnego śledzenia dla proj A, zrób to tak, git submodule update --remote --mergejak pokazano w odpowiedzi Paula Hatchera poniżej.
Ben Burns
109

Od wersji 1.8 możesz to zrobić

git submodule update --remote --merge

Spowoduje to zaktualizowanie submodułu do najnowszego zdalnego zatwierdzenia. Następnie musisz zatwierdzić zmianę, aby gitlink w repozytorium nadrzędnym został zaktualizowany

git commit

A następnie pchnij zmiany, ponieważ bez tego tożsamość SHA-1 wskazująca na podmoduł nie zostanie zaktualizowana, więc zmiana nie będzie widoczna dla nikogo innego.

Paul Hatcher
źródło
Mimo że robię to git commitwszyscy inni nadal tego nie widzą. On branch master Your branch is up-to-date with 'origin/master'. Changes not staged for commit: modified: SubmoduleA (new commits) modified: SubmoduleB (new commits)
Max N
1
Czy zrobiłeś „git push” po swoim zatwierdzeniu, pamiętaj, że commit po prostu zmienia lokalne repozytorium, musisz wypchnąć go do pilota, aby wszyscy inni go widzieli
Paul Hatcher
Brakuje tej odpowiedzi (ale zaznaczono w innych odpowiedziach poniżej): zaktualizowane submoduły muszą zostać zainscenizowane git addprzed zatwierdzeniem.
joshng
1
@ joshng Czuję, że każdy, kto jest w punkcie, w którym pracują nad submodułami, zrozumie to. To jedyny post, który mi pomógł, dzięki bardzo.
Husk Rekoms
38

Jeśli zaktualizujesz podmoduł i zatwierdzisz go, musisz przejść do repozytorium zawierającego lub wyższego poziomu i tam dodać zmianę.

git status

pokaże coś takiego:

modified:
   some/path/to/your/submodule

Fakt, że podmoduł nie jest zsynchronizowany, można również zauważyć

git submodule

wynik pokaże:

+afafaffa232452362634243523 some/path/to/your/submodule

Znak plus wskazuje, że twój podmoduł wskazuje miejsce, w którym oczekuje najwyższego repozytorium.

po prostu dodaj tę zmianę:

git add some/path/to/your/submodule

i popełnij to:

git commit -m "referenced newer version of my submodule"

Kiedy przesuwasz swoje zmiany, upewnij się, że najpierw przesuwasz zmiany w submodule, a następnie wypychasz zmianę odniesienia w zewnętrznym repozytorium. W ten sposób osoby, które dokonają aktualizacji, zawsze będą mogły pomyślnie uruchomić

git submodule update

Więcej informacji na temat submodułów można znaleźć tutaj http://progit.org/book/ch6-6.html .

Adam Dymitruk
źródło
Jeśli +po uruchomieniu nie widzisz git submodule, upewnij się, że zainicjalizowałeś i zaimportowałeś podmoduły. Polecenia, które są git submodule initi git submodule update, odpowiednio.
fureigh
19

Wersja jednoliniowa

git submodule foreach "(git checkout master; git pull; cd ..; git add '$path'; git commit -m 'Submodule Sync')"
Andy Webov
źródło
2

Kilka innych odpowiedzi zaleca scalenie / zatwierdzenie w katalogu podmodułu, co IMO może stać się nieco nieporządne.

Zakładając, że serwer zdalny jest nazwany origini chcemy mastergałęzi submodułów, zwykle używam:

git submodule foreach "git fetch && git reset --hard origin/master"

Uwaga: Wykona to twardy reset każdego podmodułu - jeśli tego nie chcesz, możesz zmienić --hardna --soft.

XtraSimplicity
źródło
1

Mój projekt powinien wykorzystywać „najnowsze” dla submodułu. W systemie Mac OSX 10.11, git w wersji 2.7.1, nie musiałem wchodzić do folderu podmodułu, aby zbierać zatwierdzenia. Po prostu robiłem regularnie

git pull --rebase 

na najwyższym poziomie i poprawnie zaktualizował mój podmoduł.

AnneTheAgile
źródło
0

Odpowiedź Andy'ego działała na mnie, uciekając przed $ path:

git submodule foreach "(git checkout master; git pull; cd ..; git add \$path; git commit -m 'Submodule Sync')"
Miguel Fernandes Muldy
źródło
Prawdopodobnie powodem, dla którego odpowiedź @Andy Webov nie wymagała ucieczki, było użycie pojedynczych cudzysłowów wokół ścieżki, np. '$path'
S0AndS0