Novità nel prossimo git1.4.4 (luglio 2013) :
" git submodule update
" può facoltativamente clonare i repository del sottomodulo in modo superficiale.
(E git 2.10 Q3 2016 consente di registrarlo con git config -f .gitmodules submodule.<name>.shallow true
.
Vedi la fine di questa risposta)
Vedi commit 275cd184d52b5b81cb89e4ec33e540fb2ae61c1f :
Aggiungi l' --depth
opzione ai comandi di aggiunta e aggiornamento di "git submodule", che viene quindi passato al comando clone. Questo è utile quando i sottomoduli sono enormi e non sei veramente interessato ad altro che all'ultimo commit.
Vengono aggiunti test e sono state apportate alcune modifiche di rientro per conformarsi al resto del file di test in "L'aggiornamento del sottomodulo può gestire collegamenti simbolici in pwd".
Firmato-fuori: Fredrik Gustafsson <iveqy@iveqy.com>
Acked-by: Jens Lehmann<Jens.Lehmann@web.de>
Ciò significa che funziona:
git submodule add --depth 1 -- repository path
git submodule update --depth -- [<path>...]
Con:
--depth::
Questa opzione è valida per add
e update
comandi.
Crea un clone 'superficiale' con una cronologia troncata al numero specificato di revisioni.
atwyman aggiunge nei commenti :
Per quanto ne so, questa opzione non è utilizzabile per i sottomoduli che non seguono master
molto da vicino. Se imposti la profondità 1, submodule update
puoi sempre riuscire solo se il commit del sottomodulo che desideri è l'ultimo master. Altrimenti ottieni " fatal: reference is not a tree
" .
Questo è vero.
Cioè, fino a git 2.8 (marzo 2016). Con 2.8, submodule update --depth
c'è ancora una possibilità di successo, anche se SHA1 è direttamente raggiungibile da uno dei repository HEAD remoti.
Vedi commit fb43e31 (24 feb 2016) di Stefan Beller ( stefanbeller
) .
Aiutato da: Junio C Hamano ( gitster
) .
(Unito da Junio C Hamano - gitster
- in commit 9671a76 , 26 febbraio 2016)
sottomodulo: fai di più per recuperare lo sha1 necessario recuperando direttamente sha1
Quando si esamina una modifica che aggiorna anche un sottomodulo in Gerrit, una pratica di revisione comune è quella di scaricare e selezionare la patch localmente per testarla.
Tuttavia, quando lo si verifica localmente, " git submodule update
" potrebbe non riuscire a recuperare il sottomodulo sha1 corretto poiché il commit corrispondente nel sottomodulo non fa ancora parte della cronologia del progetto, ma anche solo una modifica proposta.
Se $sha1
non faceva parte del recupero predefinito, proviamo a recuperare $sha1
direttamente . Alcuni server tuttavia non supportano il recupero diretto di sha1, il che porta git-fetch
a un errore rapido.
Possiamo fallire qui perché lo sha1 ancora mancante porterebbe comunque ad un fallimento più tardi nella fase di checkout, quindi fallire qui è il massimo che possiamo ottenere.
MVG sottolinea nei commenti di impegnare fb43e31 (git 2.9, febbraio 2016)
Mi sembra che il commit fb43e31 richieda il commit mancante dall'ID SHA1, quindi le impostazioni uploadpack.allowReachableSHA1InWant
e uploadpack.allowTipSHA1InWant
sul server probabilmente influenzeranno se questo funziona.
Ho scritto un post nella lista di git oggi , sottolineando come l'uso di sottomoduli superficiali potrebbe essere fatto funzionare meglio per alcuni scenari, vale a dire se il commit è anche un tag.
Aspettiamo e vediamo.
Immagino che questo sia un motivo per cui fb43e31 ha reso il recupero per un SHA1 specifico un fallback dopo il recupero per il ramo predefinito.
Tuttavia, nel caso di "--depth 1" penso che avrebbe senso interrompere presto: se nessuno dei riferimenti elencati corrisponde a quello richiesto e chiedere da SHA1 non è supportato dal server, allora non ha senso recuperare nulla, dal momento che non saremo in grado di soddisfare il requisito del sottomodulo in entrambi i casi.
Aggiornamento agosto 2016 (3 anni dopo)
Con Git 2.10 (3 ° trimestre 2016), sarai in grado di farlo
git config -f .gitmodules submodule.<name>.shallow true
Vedi " Git submodule senza peso extra " per maggiori
Git 2.13 (Q2 2017) aggiunge in commit 8d3047c (19 aprile 2017) di Sebastian Schuberth ( sschuberth
) .
(Unita da Sebastian Schuberth - sschuberth
- in commit 8d3047c , 20 apr 2017)
un clone di questo sottomodulo verrà eseguito come clone superficiale (con una profondità cronologica di 1)
Tuttavia, Ciro Santilli aggiunge nei commenti (e dettagli nella sua risposta )
shallow = true
sulla .gitmodules
influenza solo il riferimento tracciati dal capo del telecomando quando si utilizza --recurse-submodules
, anche se il bersaglio commit viene puntata da un ramo, e anche se si inserisce branch = mybranch
sulla .gitmodules
pure.
Git 2.20 (Q4 2018) migliora il supporto del sottomodulo, che è stato aggiornato per essere letto dal BLOB HEAD:.gitmodules
quando il .gitmodules
file manca dall'albero di lavoro.
Vedi commit 2b1257e , commit 76e9bdc (25 ott 2018) e commit b5c259f , commit 23dd8f5 , commit b2faad4 , commit 2502ffc , commit 996df4d , commit d1b13df , commit 45f5ef3 , commit bcbc780 (05 ott 2018) di Antonio Ospite ( ao2
) .
(Unito da Junio C Hamano - gitster
- in commit abb4824 , 13 nov 2018)
submodule
: supporta la lettura .gitmodules
quando non si trova nell'albero di lavoro
Quando il .gitmodules
file non è disponibile nell'albero di lavoro, provare a utilizzare il contenuto dall'indice e dal ramo corrente.
Questo riguarda il caso in cui il file fa parte del repository ma per qualche motivo non viene estratto, ad esempio a causa di un checkout scarso.
Ciò consente di utilizzare almeno i git submodule
comandi ' ' che leggono il gitmodules
file di configurazione senza popolare completamente l'albero di lavoro.
La scrittura su .gitmodules
richiederà comunque che il file sia stato estratto, quindi verificalo prima di chiamare config_set_in_gitmodules_file_gently
.
Aggiungi un check simile anche git-submodule.sh::cmd_add()
per anticipare l'eventuale fallimento del git submodule add
comando " " quando .gitmodules
non è scrivibile in modo sicuro; ciò impedisce al comando di lasciare il repository in uno stato spurio (ad es. il repository del sottomodulo è stato clonato ma .gitmodules
non è stato aggiornato perché config_set_in_gitmodules_file_gently
non è riuscito).
Inoltre, poiché config_from_gitmodules()
ora accede all'archivio oggetti globale, è necessario proteggere tutti i percorsi di codice che chiamano la funzione dall'accesso simultaneo all'archivio oggetti globale.
Attualmente questo accade solo in builtin/grep.c::grep_submodules()
, quindi chiama
grep_read_lock()
prima di invocare il codice che coinvolge config_from_gitmodules()
.
NOTA: esiste un raro caso in cui questa nuova funzionalità non funziona ancora correttamente: sottomoduli nidificati senza .gitmodules
nel loro albero di lavoro.
Nota: Git 2.24 (Q4 2019) corregge un possibile segfault durante la clonazione di un sottomodulo superficiale.
Vedi commit ddb3c85 (30 set 2019) di Ali Utku Selen ( auselen
) .
(Unito da Junio C Hamano - gitster
- in commit 678a9ca , 09 ott 2019)
Git 2.25 (Q1 2020), chiarisce la git submodule update
documentazione.
Vedi commit f0e58b3 (24 nov 2019) di Philippe Blain ( phil-blain
) .
(Unita da Junio C Hamano - gitster
- in commit ef61045 , 05 dic 2019)
doc
: menziona che "git submodule update" recupera i commit mancanti
Assistito: Junio C Hamano
Helped: Johannes Schindelin
Firmato-off: Philippe Blain
' git submodule
update' recupera i nuovi commit dal telecomando del sottomodulo se non viene trovato lo SHA-1 registrato nel superprogetto . Questo non è stato menzionato nella documentazione.
Avvertenza: con Git 2.25 (Q1 2020), l'interazione tra " git clone --recurse-submodules
" e il negozio di oggetti alternativi era mal progettata.
Alla documentazione e al codice è stato insegnato come formulare raccomandazioni più chiare quando gli utenti riscontrano errori.
Vedi commit 4f3e57e , commit 10c64a0 (02 dic 2019) di Jonathan Tan ( jhowtan
) .
(Unito da Junio C Hamano - gitster
- in commit 5dd1d59 , 10 dic 2019)
submodule--helper
: avvisare in caso di errore alternativo fatale
Firmato-fuori: Jonathan Tan
Acked-by: Jeff King
Quando .gitmodules
si clona in modo ricorsivo un superprogetto con alcuni moduli poco profondi definiti al suo interno , quindi si risuona con " --reference=<path>
", si verifica un errore. Per esempio:
git clone --recurse-submodules --branch=master -j8 \
https://android.googlesource.com/platform/superproject \
master
git clone --recurse-submodules --branch=master -j8 \
https://android.googlesource.com/platform/superproject \
--reference master master2
fallisce con:
fatal: submodule '<snip>' cannot add alternate: reference repository
'<snip>' is shallow
Quando non è possibile aggiungere un supplente calcolato dal supplente del superprogetto, in questo caso o in un altro, consigliare di configurare " submodule.alternateErrorStrategy
" l'opzione di configurazione e utilizzare " --reference-if-able
" anziché " --reference
" durante la clonazione.
Questo è dettagliato in:
Con Git 2.25 (Q1 2020), l'interazione tra "git clone --recurse-submodules" e un negozio di oggetti alternativi era mal progettata.
Doc
: spiega submodule.alternateErrorStrategy
Firmato-fuori: Jonathan Tan
Acked-by: Jeff King
Commit 31224cbdc7 (" clone
: l'opzione ricorsiva e di riferimento attiva i sostituti del sottomodulo", 17-08-2016, Git v2.11.0-rc0 - unione elencata nel lotto n. 1 ) ha insegnato a Git a supportare le opzioni di configurazione " submodule.alternateLocation
" e " submodule.alternateErrorStrategy
" su un superprogetto .
Se " submodule.alternateLocation
" è configurato su " superproject
" su un superprogetto, ogni volta che viene clonato un sottomodulo di quel superprogetto, calcola invece il percorso alternativo analogo per quel sottomodulo dal $GIT_DIR/objects/info/alternates
superprogetto e lo fa riferimento.
L' submodule.alternateErrorStrategy
opzione " " determina cosa succede se tale alternativa non può essere referenziata.
Tuttavia, non è chiaro che il clone procede come se non fosse stata specificata alcuna alternativa quando quell'opzione non è impostata su "die" (come si può vedere nei test in 31224cbdc7 ).
Pertanto, documentarlo di conseguenza.
La documentazione del sottomodulo di configurazione ora include:
submodule.alternateErrorStrategy::
Specifica come trattare gli errori con i supplenti per un sottomodulo come calcolati tramite submodule.alternateLocation
.
I valori possibili sono ignore
, info
, die
.
L'impostazione predefinita è die
.
Notare che se impostato su ignore
o info
e se si verifica un errore con l'alternativa calcolata, il clone procede come se non fosse stata specificata alcuna alternativa .
git submodule add/update
" ora può clonare i repository sottomoduli in modo superficiale! Vedi la mia risposta qui sotto