Czy istnieje sposób, aby automatycznie mieć git submodule update
(lub najlepiej git submodule update --init
dzwonić za każdym razem, gdy git pull
jest to zrobione?
Szukasz ustawienia konfiguracji git lub aliasu git, aby Ci w tym pomóc.
Czy istnieje sposób, aby automatycznie mieć git submodule update
(lub najlepiej git submodule update --init
dzwonić za każdym razem, gdy git pull
jest to zrobione?
Szukasz ustawienia konfiguracji git lub aliasu git, aby Ci w tym pomóc.
Odpowiedzi:
Począwszy od Gita 2.14 , możesz używać git pull --recurse-submodules
(i aliasować go na cokolwiek chcesz).
Od wersji 2.15 Git można ustawić wartość submodule.recurse
true, aby umożliwić pożądane zachowanie.
Możesz to zrobić globalnie, uruchamiając:
git config --global submodule.recurse true
git pull
również pobranie submodułu i uruchomienie submodule update
. To naprawdę musi być teraz zaakceptowana odpowiedź
git config --global submodule.recurse true
git clone
. I włącz to domyślnie. W przeciwnym razie zawsze będzie ogromny opór przed korzystaniem z submodułów, ponieważ moduły ludzi zawsze nie są zsynchronizowane :-(
commit
, fetch
, pull
etc.) są przeznaczone do stosowania tylko do aktualnego repozytorium. submoduł jest innym repozytorium i domyślnie nie powinny na niego wpływać polecenia wykonywane w repozytorium nadrzędnym. jest to rodzaj decyzji projektowej autorstwa git-developer.
git config --global alias.pullall '!git pull && git submodule update --init --recursive'
Jeśli chcesz przekazać argumenty do git pull, użyj tego zamiast tego:
git config --global alias.pullall '!f(){ git pull "$@" && git submodule update --init --recursive; }; f'
Począwszy od wersji 1.7.5 Git powinien automatycznie aktualizować podmoduły, tak jak tego chcesz.
[EDIT: za komentarze: nowy 1.7.5 zachowanie jest do automatycznego pobierania najnowszych zobowiązuje do submodules, ale nie do aktualizować je (w git submodule update
sensie). Dlatego informacje zawarte w tej odpowiedzi są istotne jako tło, ale same w sobie nie stanowią pełnej odpowiedzi. Nadal potrzebujesz aliasu, aby pobrać i zaktualizować submoduły za pomocą jednego polecenia.]
Domyślne zachowanie, „na żądanie”, polega na aktualizacji podmodułów za każdym razem, gdy pobierasz zatwierdzenie, które aktualizuje zatwierdzenie podmodułu, a to zatwierdzenie nie znajduje się jeszcze w lokalnym klonie.
Możesz także aktualizować go przy każdym pobieraniu lub nigdy (zakładam, że zachowanie wcześniejsze niż 1.7.5).
Opcja konfiguracji zmiany tego zachowania to fetch.recurseSubmodules
.
Ta opcja może być ustawiona na wartość logiczną lub na
on-demand
.
Ustawienie go na wartość logiczną zmienia zachowaniefetch
ipull
bezwarunkową rekurencję w podmoduły, gdy jest ustawiona na wartość true lub w ogóle nie powtarza się, gdy jest ustawiona na wartość false.Po ustawieniu na
on-demand
(wartość domyślna)fetch
ipull
będzie się powtarzać w zaludnionym podmodule tylko wtedy, gdy jego superprojekt pobierze zatwierdzenie, które aktualizuje odwołanie do podmodułu .
Widzieć:
git config
strona podręcznika (1.7.5) (lub najnowsza git config
strona podręcznika )git fetch
strona man (1.7.5) (lub najnowsza strona man git fetch )po więcej informacji.
git fetch --recurse-submodules[=yes|on-demand|no]
git fetch
, a nie git submodule update
.
git pull
, zamiast git fetch
tej opcji sprawia, że tylko pobieranie rekurencyjne. Nie zmieni to wcale zatwierdzenia zatwierdzonego w podmodułach. Tak git submodule update
jest nadal konieczne, jak zauważył @Artem.
Dziwię się, że nikt nie wspominał o używaniu haków git do tego celu!
Po prostu dodaj pliki o nazwach post-checkout
i post-merge
do .git/hooks
katalogu odpowiednich repozytoriów i umieść w każdym z nich:
#!/bin/sh
git submodule update --init --recursive
Ponieważ konkretnie poprosiłeś o alias, zakładając, że chcesz go mieć dla wielu repozytoriów, możesz utworzyć alias, który doda je do repozytorium .git/hooks
.
core.hooksPath
dla katalogu hooków , git-config
więcej informacji można znaleźć w dokumentacji .
git pull --rebase
:(
Możesz utworzyć alias dla polecenia git, który automatycznie obsługuje aktualizację podmodułów. Dodaj następujące elementy do pliku .bashrc
# make git submodules usable
# This overwrites the 'git' command with modifications where necessary, and
# calls the original otherwise
git() {
if [[ $@ == clone* ]]; then
gitargs=$(echo "$@" | cut -c6-)
command git clone --recursive $gitargs
elif [[ $@ == pull* ]]; then
command git "$@" && git submodule update --init --recursive
elif [[ $@ == checkout* ]]; then
command git "$@" && git submodule update --init --recursive
else
command git "$@"
fi
}
Jak wspomnieli inni, możesz to łatwo ustawić za pomocą:
git config --global submodule.recurse true
Jednak jeśli jesteś podobny do mnie i masz bardziej złożoną .gitconfig
konfigurację (mój główny ~/.gitconfig
plik używa include
do ładowania innych .gitconfig
plików) i nigdy nie pamiętasz, jak przekonwertować między git
formatem konfiguracji wiersza polecenia a .gitconfig
formatem, oto jak go dodać do dowolnego z twoich .gitconfig
plików:
[submodule]
recurse = true
Jedyny sposób, w jaki udało mi się pobrać submoduły i zagnieżdżone moduły do aktualizacji:
git submodule update --remote --merge --recursive; git submodule foreach --recursive "(git add .; git commit -m 'SubmoduleSync'; git push; git pull;);" git add .; git commit -m 'SubmodulesSynced'; git push; git pull;
Z powodu nawiasów walczyłem o utworzenie aliasu przez terminal, więc musiałem ręcznie dodać to do .gitconfig dla globalnego:
[alias] supdate = "!git submodule update --remote --merge --recursive; git submodule foreach --recursive '(git add .; git commit -m 'SubmoduleSync'; git push; git pull;);' git add .; git commit -m 'SubmodulesSynced'; git push; git pull;"
Wszelkie sugestie dotyczące automatycznego uruchamiania poleceń lub aliasu?