Czy istnieje sposób, aby automatycznie mieć git submodule update(lub najlepiej git submodule update --initdzwonić za każdym razem, gdy git pulljest 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 --initdzwonić za każdym razem, gdy git pulljest 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.recursetrue, aby umożliwić pożądane zachowanie.
Możesz to zrobić globalnie, uruchamiając:
git config --global submodule.recurse true
git pullró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, pulletc.) 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 updatesensie). 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 zachowaniefetchipullbezwarunkową 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)fetchipullbędzie się powtarzać w zaludnionym podmodule tylko wtedy, gdy jego superprojekt pobierze zatwierdzenie, które aktualizuje odwołanie do podmodułu .
Widzieć:
git configstrona podręcznika (1.7.5) (lub najnowsza git configstrona podręcznika )git fetchstrona 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 fetchtej opcji sprawia, że tylko pobieranie rekurencyjne. Nie zmieni to wcale zatwierdzenia zatwierdzonego w podmodułach. Tak git submodule updatejest 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-checkouti post-mergedo .git/hookskatalogu 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.hooksPathdla katalogu hooków , git-configwię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ą .gitconfigkonfigurację (mój główny ~/.gitconfigplik używa includedo ładowania innych .gitconfigplików) i nigdy nie pamiętasz, jak przekonwertować między gitformatem konfiguracji wiersza polecenia a .gitconfigformatem, oto jak go dodać do dowolnego z twoich .gitconfigplikó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?