2011-01-06 13 views
108

Czy istnieje sposób, aby automatycznie git submodule update (lub korzystnie git submodule update --init nazwie ilekroć git pull odbywa?Czy istnieje sposób, aby Git pull automatycznie aktualizował submodules?

Szukasz ustawienie git config lub aliasu git, aby pomóc z tym.

+3

Powiązane: http://stackoverflow.com/questions/1899792/why-is-git-submodule-update-not-automatic – philfreo

+0

Dlaczego alias git jest lepszy od aliasu powłoki? – wnoise

+14

aliasy git są ładne, ponieważ hermetyzują polecenie w przestrzeni nazw "git". Możesz równie dobrze zapytać, dlaczego wszystkie polecenia git zaczynają się od "git", zamiast mieć własne imiona. –

Odpowiedz

99

git config --global alias.pullall '!git pull && git submodule update --init --recursive'

Jeśli chcesz, aby argumenty były przekazywane do polecenia git pull, a następnie użyj tego:

git config --global alias.pullall '!f(){ git pull "[email protected]" && git submodule update --init --recursive; }; f' 
+3

pamiętaj, aby użyć "git config --global", jeśli chcesz używać tego aliasu we wszystkich repozytoriach git, których używasz – yoyo

8

Alias, zgodnie z sugestią Kevina Ballard, to doskonałe rozwiązanie. Wystarczy rzucić inną opcję tam, można również użyć haka po scaleniu, który po prostu działa git submodule update [--init].

39

Począwszy od Git 1.7.5 powinien automatycznie aktualizować submoduły, tak jak tego chcesz.

[EDIT: za komentarze: nowy 1.7.5 zachowanie jest automatycznie sprowadzić ostatni zobowiązuje do submodules, ale nie do aktualizacja nich (w git submodule update sensie). Tak więc informacje w tej odpowiedzi są istotne jako tło, ale nie stanowią kompletnej odpowiedzi. Nadal potrzebujesz aliasu do pobierania i aktualizowania submodułów w jednym poleceniu.]

Domyślnym zachowaniem "na żądanie" jest aktualizacja submodułów za każdym razem, gdy pobierasz zatwierdzenie, które aktualizuje commit modułu, a to zatwierdzenie nie jest już znajduje się w twoim lokalnym klonie.
Możesz także aktualizować go przy każdym pobieraniu lub nigdy (zachowanie przed 1.7.5, które zakładam).
Opcja zmiany tego zachowania to fetch.recurseSubmodules.

Ta opcja może być ustawiona na wartość boolowską lub na on-demand.
Ustawienie wartości logicznej zmienia zachowanie fetch i pull na bezwarunkową rekurencję na submoduły po ustawieniu na wartość true lub na nierekurowanie w ogóle, gdy ustawiono na wartość false.

Przy ustawieniu on-demand (wartość domyślna), fetch i pullspowoduje przeszukanie tylko w zaludnionym modułem gdy jego superproject pobiera commit że aktualizuje referencyjne modułem za.

Patrz:

aby uzyskać więcej informacji.

git fetch --recurse-submodules[=yes|on-demand|no] 
+27

Uważaj: jak wyjaśniają poniższe odpowiedzi, powoduje to automatyczne pobranie zmian, nadal musisz wykonać aktualizację modułu - więc odpowiedź aliasów jest właściwa. – Artem

+4

@Artem jest poprawny. Ta odpowiedź, choć przydatna, nie odnosi się do całego pytania. To ustawienie po prostu wykonuje 'pobieranie git ', a nie' aktualizację modułu git'. –

+2

Ta odpowiedź jest bardzo zwodnicza. Nawet jeśli używa się 'git pull', zamiast' git fetch', ta opcja powoduje tylko rekurencję * fetching *. Nie zmieni to, co zostało zatwierdzone w submodułach. Więc 'git submodule update' jest nadal niezbędna, jak zauważył @Artem. –

3

Można utworzyć alias dla polecenia git, który automatycznie obsługuje aktualizację modułu. Dodaj następujące elementy do swojego.bashrc

# make git submodules usable 
# This overwrites the 'git' command with modifications where necessary, and 
# calls the original otherwise 
git() { 
    if [[ [email protected] == clone* ]]; then 
     gitargs=$(echo "[email protected]" | cut -c6-) 
     command git clone --recursive $gitargs 
    elif [[ [email protected] == pull* ]]; then 
     command git "[email protected]" && git submodule update --init --recursive 
    elif [[ [email protected] == checkout* ]]; then 
     command git "[email protected]" && git submodule update --init --recursive 
    else 
     command git "[email protected]" 
    fi 
} 
+1

Zamiast aliasu dla git, możesz dodać aliasy do git za pomocą polecenia alias lub tworząc polecenia na swojej ścieżce zaczynające się od git- (git-bettermodule). – idbrii

21

Jestem zaskoczony, że nikt nie wspomniał o użyciu haków git, aby to zrobić!

Wystarczy dodać pliki o nazwie post-checkout i post-merge do katalogu odpowiednich repozytoriach .git/hooks i umieścić następujące do każdego z nich:

#!/bin/sh 
git submodule update --init --recursive 

Ponieważ specfically poprosił o aliasu, zakładając, że chcesz mieć ten w przypadku wielu repozytoriów możesz utworzyć alias, który doda je do repozytorium .git/hooks.

+0

Czy istnieje sposób na uczynienie tego ustawienia globalnym? Lub jeden otrzymasz automatycznie podczas sprawdzania repozytorium? –

+0

Najnowsza wersja git, 2.9, [dodano ustawienie o nazwie 'core.hooksPath' dla katalogu hooks] (https://github.com/blog/2188-git-2-9-has-been-released# git-tidbits-gitbits-tidgits), zobacz dokumentację 'git-config', aby uzyskać więcej szczegółów. – taleinat

+0

Co do czegoś otrzymanego automatycznie podczas sprawdzania, szukałem, ale nie mogłem znaleźć niczego w tym rodzaju. Jedno źródło wspomniało, że celowo nie jest obsługiwane z powodu problemów z bezpieczeństwem, ponieważ można go z łatwością wykorzystać do uruchamiania dowolnego kodu na komputerach klienckich. – taleinat

Powiązane problemy