2/14/2013

Update wszystkich submodułów w GIT

Jeżeli w swoim repozytorium gita korzystasz z kilku/kilkunastu repozytoriów to po dłuższej chwili zacznie cię mocno irytować taka rutyna:
  1. wchodzę w submoduł
  2. sprawdzam gałąź, czy jest na master
  3. odpalam git pull
  4. wychodzę z submodułu
Jest na to łatwy sposób. Wystraczy wklepać w konsoli:
git submodule foreach git pull
Ale uwaga, tutaj niespodzianka ;) Jeżeli dopiero co zassałeś swoje repozytorium w którym masz submoduły, to aby działały musisz najpierw odpalić:
git submodule init
git submodule update --recursive
wszystko się oczywiście wykona, ale submoduły zostaną zaktualizowane do konkretnego commita, którego ustawiłeś wykonując wcześniej git push. Co implikuje to, że nie będziesz miał ustawionej gałęzi w żadnym z submodułów. Submoduł będzie wskazywał na konkretnego commita, a nie na gałąź.

git submodule update --recursive
Jest to oczywiście normalne i tak powinno to działać! Taka jest idea submodułów. Odwołują się do commita, którego im przypisałeś, a nie do konkretnej gałęzi.

Gdy dopiero co budujesz swoje repozytorium i dodajesz submoduły do swojego repo, mają one gałąź i jest to normalne, lecz w momencie gdy je wypychasz i ktoś je sklonuje (albo, ty sam to zrobisz do innego katalogu), to po aktualizacji submodułów będą one wskazywały właśnie na commit, a nie na gałąź. Dlatego też, gdy sklonujesz sobie repozytorium i chcesz wprowadzić jakieś zmiany, np. aktualizacja submodułu do najnowszej wersji warto wykonać:
git submodule init
git submodule update --recursive
A następnie jedno z dwóch poleceń:

Gdy nie masz ustawionych gałęzi, czyli najczęściej zaraz po sklonowaniu (pobierze gałąź master lub jakąkolwiek inną jaką wskażesz):
git submodule foreach git pull origin master
git submodule foreach git checkout master
Gdy masz ustawione gałęzie we wszystkich submodułach (pobierze gałąź na której aktualnie się znajduje, czyli tą na którą wskazuje HEAD):
git submodule foreach git pull
I to chyba tyle, jest jeszcze problem, gdy prawie wszystkie twoje submoduły opierają się o gałąź master, a jeden np. o gałąź develop, ale wskoczyć do tego jednego i odpalić git pull to już chyba nie problem.