Stiamo usando i sottomoduli git per gestire un paio di grandi progetti che hanno dipendenze da molte altre librerie che abbiamo sviluppato. Ogni libreria è un repo separato portato nel progetto dipendente come un sottomodulo. Durante lo sviluppo, spesso vogliamo semplicemente andare a prendere l'ultima versione di ogni sottomodulo dipendente.
Git ha un comando integrato per fare questo? Se no, che ne dite di un file batch di Windows o simile che possa farlo?
Se è la prima volta che fai il checkout di un repo, devi prima usare --init
:
git submodule update --init --recursive
Per git 1.8.2 o superiore è stata aggiunta l'opzione --remote
per supportare l'aggiornamento agli ultimi consigli dei rami remoti:
git submodule update --recursive --remote
Questo ha l'ulteriore vantaggio di rispettare qualsiasi "non default" ramo specificato nei file .gitmodules
o .git/config
(se ti capita di averne, il default è origin/master, nel qual caso alcune delle altre risposte qui funzionerebbero ugualmente).
Per git 1.7.3 o superiore è possibile utilizzare (ma gli inconvenienti sottostanti su cosa fa update sono ancora validi):
git submodule update --recursive
oppure:
git pull --recurse-submodules
se vuoi tirare i tuoi sottomoduli agli ultimi commit invece di quelli a cui punta il repo.
Vedere git-submodule(1) per dettagli
**Nota: questo è del 2009 e potrebbe essere stato buono allora, ma ci sono opzioni migliori ora.
Noi usiamo questo. Si chiama git-pup
:
#!/bin/bash
# Exists to fully update the git repo that you are sitting in...
git pull && git submodule init && git submodule update && git submodule status
Basta metterlo in una directory bin adatta (/usr/local/bin). Se sei su Windows, potresti dover modificare la sintassi per farlo funzionare :)
Aggiornamento:
In risposta al commento dell'autore originale circa l'estrazione di tutti gli HEAD di tutti i sottomoduli - questa è una buona domanda.
Sono abbastanza sicuro che git
non abbia internamente un comando per questo. Per farlo, avresti bisogno di identificare cosa sia realmente HEAD per un sottomodulo. Questo potrebbe essere semplice come dire che master
è il ramo più aggiornato, ecc...
In seguito, create un semplice script che faccia quanto segue:
stato dei sottomoduligit
per i repository "modificati". Il primo carattere delle linee di output lo indica. Se un sub-repo è modificato, è meglio NON procedere.git checkout master && git pull
. Controlla se ci sono errori.Vorrei menzionare che questo stile non è proprio quello per cui sono stati progettati i sottomoduli git. Tipicamente, vuoi dire "LibraryX" è alla versione "2.32" e rimarrà tale finché non gli dirò di "aggiornare".
Questo è, in un certo senso, quello che state facendo con lo script descritto, ma solo più automaticamente. È necessario fare attenzione!
Aggiornamento 2:
Se siete su una piattaforma Windows, potreste voler guardare all'uso di Python per implementare lo script, dato che è molto capace in queste aree. Se siete su unix/linux, allora vi suggerisco solo uno script bash.
Hai bisogno di chiarimenti? Basta postare un commento.
Penso che dovrai scrivere uno script per fare questo. Ad essere onesti, potrei installare python per farlo in modo che tu possa usare os.walk
per cd
in ogni directory ed emettere i comandi appropriati. Usare python o qualche altro linguaggio di scripting, diverso dal batch, ti permetterebbe di aggiungere/rimuovere facilmente i sottoprogetti senza dover modificare lo script.