2011-01-06 5 views
108

C'è un modo per avere automaticamente git submodule update (o, preferibilmente, git submodule update --init chiamato ogni volta git pull è fatto?C'è un modo per far sì che git pull aggiorni automaticamente i sottomoduli?

ricerca di un ambiente git config, o un alias git per aiutare con questo.

+3

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

+0

Perché un alias git è preferibile a un alias di shell? – wnoise

+14

Gli alias git sono belli perché incapsulano il comando nello spazio dei nomi "git". Puoi anche chiedere perché tutti i comandi git iniziano con "git" invece di avere i loro nomi. –

risposta

99

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

Se vuoi passare argomenti a git pull, quindi usa questo:

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

ricorda di usare "git config --global" se vuoi questo alias su tutti i repository git che usi – yoyo

8

Un alias, come suggerito da Kevin Ballard, è una soluzione perfettamente valida. Solo per lanciare un'altra opzione, potresti anche usare un hook post-merge che esegue semplicemente git submodule update [--init].

39

A partire da Git 1.7.5 dovrebbe aggiornare automaticamente i sottomoduli per impostazione predefinita come si desidera.

[EDIT: per i commenti: il nuovo 1.7.5 comportamento è automaticamente prendere l'ultima impegna per sottomoduli, ma non -aggiornamento loro (nel senso git submodule update). Quindi le informazioni in questa risposta sono rilevanti come sfondo, ma non è una risposta completa di per sé. Hai ancora bisogno di un alias per estrarre e aggiornare i sottomoduli in un unico comando.]

Il comportamento predefinito, "su richiesta", consiste nell'aggiornare i sottomoduli ogni volta che recuperi un commit che aggiorna il commit del sottomodulo, e questo commit non è già localizzato nel tuo clone locale.
Puoi anche averlo aggiornato su ogni fetch o mai (comportamento pre-1.7.5 presumo).
L'opzione di configurazione per modificare questo comportamento è fetch.recurseSubmodules.

Questa opzione può essere impostata su un valore booleano o su on-demand.
Impostandolo su un valore booleano, il comportamento di fetch e pull ricorre incondizionatamente ai sottomoduli se impostato su true o non recurse del tutto quando è impostato su false.

Quando è impostato su on-demand (il valore predefinito), fetch e pullsarà ricorsivamente in un modulo popolata solo quando il suo SuperProject recupera un commit che aggiorna il riferimento del modulo.

See:

per ulteriori informazioni.

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

Attenzione: come spiegano le risposte qui sotto, questo recupera solo automaticamente le modifiche, devi ancora aggiornare un sottomodulo - quindi la risposta alias è giusta. – Artem

+4

@Artem è corretto. Questa risposta, sebbene utile, non affronta l'intera domanda. Questa impostazione esegue semplicemente un 'git fetch', non un' git submodule update'. –

+2

Questa risposta è altamente ingannevole. Anche se usato con 'git pull', piuttosto che' git fetch', questa opzione rende * ricorsivo * ricorsivo *. Non cambierà affatto ciò che viene eseguito il commit nei sottomoduli. Quindi 'git submodule update' è ancora necessario, come notato da @Artem. –

3

È possibile creare un alias per il comando git che gestisce automaticamente l'aggiornamento del modulo. Aggiungi il seguente al tuo.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

Invece di un alias per git, è possibile aggiungere alias git tramite il comando alias o creando comandi nel percorso che iniziano con git- (git-bettermodule) – idbrii

21

Sono sorpreso nessuno ha menzionato l'uso di git ganci per fare questo!

Basta aggiungere i file denominati post-checkout e post-merge al vostro .git/hooks directory dei repository rilevanti, e inserire il seguente in ciascuno di essi:

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

Dal momento che si specfically chiesto un alias, è ammesso vuole avere questo per molti repository, puoi creare un alias che li aggiunge al repository .git/hooks per te.

+0

Esiste un modo per rendere questa un'impostazione globale? O uno si ottiene automaticamente quando si controlla il repository? –

+0

L'ultima versione di git, 2.9, ha [aggiunto un'impostazione chiamata 'core.hooksPath' per una directory hooks] (https://github.com/blog/2188-git-2-9-has-been-released# git-tidbits-gitbits-tidgits), vedere i documenti per 'git-config' per maggiori dettagli. – taleinat

+0

Come per qualcosa ricevuto automaticamente al momento del check-out, ho cercato ma non ho trovato nulla del genere. Una fonte ha affermato che questo non è volutamente supportato per problemi di sicurezza, dal momento che potrebbe essere facilmente utilizzato per eseguire codice arbitrario sulle macchine client. – taleinat