C'è un modo per avere automaticamente git submodule update(o preferibilmente git submodule update --initchiamato ogni volta che git pullviene 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 --initchiamato ogni volta che git pullviene 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.recursesu true per abilitare il comportamento desiderato.
Puoi farlo a livello globale eseguendo:
git config --global submodule.recurse true
git pullanche 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 updatesenso). 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 comportamentofetche sipullricorre incondizionatamente ai sottomoduli quando impostato su true o per non ricorrere affatto quando impostato su false.Quando è impostato
on-demand(il valore predefinito),fetchepullsarà solo recurse in un modulo popolata quando il suo SuperProject recupera un commit che gli aggiornamenti di riferimento del modulo .
Vedere:
git configpagina man (1.7.5) (o ultima git configpagina man )git fetchman 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-checkoute post-mergenella .git/hooksdirectory 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/hooksper te.
core.hooksPathper una directory hooks , vedere i documenti git-configper 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 .gitconfigun'installazione più complessa (il mio ~/.gitconfigfile principale utilizza includeper caricare in altri .gitconfigfile) e non riesci mai a ricordare come convertire tra il gitformato di configurazione della riga di comando e il .gitconfigformato, ecco come aggiungerlo a uno qualsiasi dei tuoi .gitconfigfile:
[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?