C'è un modo per avere automaticamente git submodule update
(o preferibilmente git submodule update --init
chiamato ogni volta che git pull
viene fatto?
Cerchi un'impostazione di configurazione git o un alias git per aiutarti.
C'è un modo per avere automaticamente git submodule update
(o preferibilmente git submodule update --init
chiamato ogni volta che git pull
viene fatto?
Cerchi un'impostazione di configurazione git o un alias git per aiutarti.
Risposte:
A partire da Git 2.14 , puoi usarlo git pull --recurse-submodules
(e aliaslo come preferisci).
A partire da Git 2.15 , è possibile impostare submodule.recurse
su true per abilitare il comportamento desiderato.
Puoi farlo a livello globale eseguendo:
git config --global submodule.recurse true
git pull
anche il recupero di un sottomodulo e l'esecuzione submodule update
. Questa deve davvero essere la risposta accettata ora
git config --global submodule.recurse true
git clone
. E accendilo per impostazione predefinita. Altrimenti, ci sarà sempre un'enorme resistenza all'uso dei sottomoduli, poiché i moduli delle persone non sono sempre sincronizzati :-(
commit
, fetch
, pull
, etc.) sono progettati per essere applicato solo al repository corrente. un sottomodulo è un altro repository e non dovrebbe essere influenzato dai comandi eseguiti nel repository principale per impostazione predefinita. questo è un tipo di decisione progettuale da parte dello sviluppatore git.
git config --global alias.pullall '!git pull && git submodule update --init --recursive'
Se vuoi che gli argomenti vengano passati a git pull, usa invece questo:
git config --global alias.pullall '!f(){ git pull "$@" && git submodule update --init --recursive; }; f'
A partire da Git 1.7.5 dovrebbe aggiornare automaticamente i sottomoduli di default come si desidera.
[EDIT: per commenti: il nuovo comportamento 1.7.5 è quello di recuperare automaticamente gli ultimi commit per i sottomoduli, ma non di aggiornarli (nel git submodule update
senso). Quindi le informazioni in questa risposta sono rilevanti come sfondo, ma non sono una risposta completa da sola. Hai ancora bisogno di un alias per estrarre e aggiornare i sottomoduli con un solo comando.]
Il comportamento predefinito, "su richiesta", è di aggiornare i sottomoduli ogni volta che si recupera un commit che aggiorna il commit del sottomodulo e questo commit non si trova già nel clone locale.
Puoi anche averlo aggiornato su ogni recupero o mai (comportamento precedente alla 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 si modifica il comportamentofetch
e sipull
ricorre incondizionatamente ai sottomoduli quando impostato su true o per non ricorrere affatto quando impostato su false.Quando è impostato
on-demand
(il valore predefinito),fetch
epull
sarà solo recurse in un modulo popolata quando il suo SuperProject recupera un commit che gli aggiornamenti di riferimento del modulo .
Vedere:
git config
pagina man (1.7.5) (o ultima git config
pagina man )git fetch
man page (1.7.5) (o l'ultima pagina man di git fetch )per maggiori informazioni.
git fetch --recurse-submodules[=yes|on-demand|no]
git fetch
, non a git submodule update
.
git pull
, piuttosto che git fetch
, questa opzione rende il recupero ricorsivo. Non cambierà affatto quale commit è stato estratto nei sottomoduli. Quindi git submodule update
è ancora necessario, come notato da @Artem.
Sono sorpreso che nessuno abbia menzionato l'uso di git hook per farlo!
Basta aggiungere i file denominati post-checkout
e post-merge
nella .git/hooks
directory dei repository pertinenti e inserire quanto segue in ciascuno di essi:
#!/bin/sh
git submodule update --init --recursive
Dato che hai chiesto specificatamente un alias, supponendo che tu voglia averlo per molti repository, puoi creare un alias che li aggiunge a un repository .git/hooks
per te.
core.hooksPath
per una directory hooks , vedere i documenti git-config
per maggiori dettagli.
git pull --rebase
:(
È possibile creare un alias per il comando git che gestisce automaticamente l'aggiornamento del sottomodulo. Aggiungi quanto segue al tuo .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
}
Come altri hanno già detto, puoi facilmente impostarlo con:
git config --global submodule.recurse true
Tuttavia, se sei come me e hai .gitconfig
un'installazione più complessa (il mio ~/.gitconfig
file principale utilizza include
per caricare in altri .gitconfig
file) e non riesci mai a ricordare come convertire tra il git
formato di configurazione della riga di comando e il .gitconfig
formato, ecco come aggiungerlo a uno qualsiasi dei tuoi .gitconfig
file:
[submodule]
recurse = true
L'unico modo in cui sono stato in grado di ottenere l'aggiornamento dei sottomoduli e dei sottomoduli nidificati:
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;
Avevo difficoltà a creare l'alias tramite terminal a causa delle parentesi, quindi ho dovuto aggiungere manualmente questo a .gitconfig per global:
[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;"
Qualche suggerimento su come eseguire automaticamente i comandi o l'alias?