(Git 2.22, Q2 2019, ha introdotto git submodule set-branch --branch aBranch -- <submodule_path>
)
Nota che se hai un sottomodulo esistente che non sta ancora monitorando un ramo , ( se hai git 1.8.2+ ):
Assicurati che il repository principale sappia che il suo sottomodulo ora traccia un ramo:
cd /path/to/your/parent/repo
git config -f .gitmodules submodule.<path>.branch <branch>
Assicurati che il tuo sottomodulo sia effettivamente al più tardi di quel ramo:
cd path/to/your/submodule
git checkout -b branch --track origin/branch
# if the master branch already exist:
git branch -u origin/master master
(con "origine" come nome del repository remoto a monte da cui è stato clonato il sottomodulo. Verrà visualizzato
un git remote -v
interno di quel sottomodulo. Di solito, è "origine")
Non dimenticare di registrare il nuovo stato del tuo sottomodulo nel repository principale:
cd /path/to/your/parent/repo
git add path/to/your/submodule
git commit -m "Make submodule tracking a branch"
L'aggiornamento successivo per quel sottomodulo dovrà utilizzare l' --remote
opzione:
# update your submodule
# --remote will also fetch and ensure that
# the latest commit from the branch is used
git submodule update --remote
# to avoid fetching use
git submodule update --remote --no-fetch
Nota che con Git 2.10+ (Q3 2016), puoi usare ' .
' come nome di filiale:
Il nome del ramo è registrato come submodule.<name>.branch
in .gitmodules
per update --remote
.
Un valore speciale di .
viene utilizzato per indicare che il nome del ramo nel sottomodulo deve avere lo stesso nome del ramo corrente nel repository corrente .
Ma, come commentato da LubosD
Con git checkout
, se il nome del ramo da seguire è " .
", ucciderà il tuo lavoro non confermato!
Usa git switch
invece.
Ciò significa che Git 2.23 (agosto 2019) o più.
Vedi " Confuso dagit checkout
"
Se vuoi aggiornare tutti i tuoi sottomoduli seguendo un ramo:
git submodule update --recursive --remote
Si noti che il risultato, per ogni sottomodulo aggiornato, sarà quasi sempre una TESTA distaccata , come osserva Dan Cameron nella sua risposta .
( Clintm nota nei commenti che, se si esegue git submodule update --remote
e lo sha1 risultante è lo stesso del ramo su cui si trova attualmente il sottomodulo, non farà nulla e lascerà il sottomodulo ancora "su quel ramo" e non in stato head distaccato. )
Per assicurarsi che il ramo sia effettivamente estratto (e che non modifichi lo SHA1 della voce speciale che rappresenta il sottomodulo per il repository principale), suggerisce:
git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; git switch $branch'
Ogni sottomodulo farà comunque riferimento allo stesso SHA1, ma se si effettuano nuovi commit, si sarà in grado di inviarli perché saranno indicati dal ramo che si desidera monitorare il sottomodulo.
Dopo tale push all'interno di un sottomodulo, non dimenticare di tornare al repository principale, aggiungere, eseguire il commit e inviare il nuovo SHA1 per quei sottomoduli modificati.
Si noti l'uso di $toplevel
, raccomandato nei commenti di Alexander Pogrebnyak .
$toplevel
è stato introdotto in git1.7.2 a maggio 2010: commit f030c96 .
contiene il percorso assoluto della directory di livello superiore (dove si .gitmodules
trova).
dtmland
aggiunge nei commenti :
Lo script foreach non eseguirà il checkout dei sottomoduli che non seguono un ramo.
Tuttavia, questo comando ti dà entrambi:
git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; [ "$branch" = "" ] && git checkout master || git switch $branch' –
Lo stesso comando ma più facile da leggere:
git submodule foreach -q --recursive \
'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; \
[ "$branch" = "" ] && \
git checkout master || git switch $branch' –
umläute perfeziona il comando di dtmland con una versione semplificata nei commenti :
git submodule foreach -q --recursive 'git switch $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'
più righe:
git submodule foreach -q --recursive \
'git switch \
$(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'
Prima di Git 2.26 (Q1 2020), un recupero che viene detto di recuperare ricorsivamente gli aggiornamenti nei sottomoduli produce inevitabilmente risme di output e diventa difficile individuare i messaggi di errore.
Al comando è stato insegnato a enumerare i sottomoduli che presentavano errori alla fine dell'operazione .
Vedi commit 0222540 (16 gennaio 2020) di Emily Shaffer ( nasamuffin
) .
(Unita da Junio C Hamano - gitster
- in commit b5c71cc , 05 feb 2020)
fetch
: enfatizza l'errore durante il recupero del sottomodulo
Firmato-fuori-da: Emily Shaffer
Nei casi in cui un recupero del sottomodulo fallisce quando ci sono molti sottomoduli, l'errore del recupero del sottomodulo solitario non riuscito viene seppellito sotto attività sugli altri sottomoduli se più di un recupero ricade su fetch-by-oid
.
Richiama un errore in ritardo, quindi l'utente è consapevole che qualcosa è andato storto e dove .
Perché fetch_finish()
viene chiamato solo in modo sincrono dal run_processes_parallel,
mutexing non è richiesto in giro submodules_with_errors
.