2014-11-28 9 views
11

So che è possibile avere sottomoduli superficiali usando l'opzione --depth con git submodule update.Clone poco profondo con sottomoduli in git, come usare i commit puntati e non quelli più recenti?

Tuttavia, se corro

git submodule update --init --recursive --depth 1 

sul mio progetto con diversi moduli, ho un fatal: reference is not a tree. Così ho ancora provato con

git submodule update --init --recursive --depth 100 

che ha funzionato correttamente, però mi piacerebbe mantenere la profondità a 1.

Mi sembra che --depth 1 tira l'ultimo commit nel modulo, non il commit puntato dal repository principale, ed è per questo che impostarlo su 100 ha risolto il problema, dal momento che ha tirato una lista più lunga di commit, compresi quelli appuntiti.

Sfortunatamente, se questo è il caso, in genere non posso essere sicuro che gli ultimi 100 commit includano quello di cui ho bisogno.

Come si dice a Git di utilizzare i commit puntati e non quelli più recenti nel clone poco profondo con i sottomoduli?

Sto usando git 1.9.4 su Windows.

+0

Vedere anche il sottomodulo git config -f .gitmodules. .shallow true' con http://stackoverflow.com/a/38895397/6309 – VonC

risposta

7

Sfortunatamente non sembra essere un modo per fare un git fetch con un solo ID di commit specifico. Se c'è vorrei davvero saperlo. Tuttavia, ho affrontato il problema in due modi diversi: uno, se possibile, è creare un tag o ramo sul repository remoto che punta al commit che voglio, diciamo che lo chiamiamo "ref". In questo modo posso recuperare il ref remoto e verrà applicato il --depth, non il consiglio più recente. Invece di git submodule update --init che faccio:

git submodule init 
git clone --depth 1 -b ref --separate-git-dir .git/modules/sub/ repository sub 

dove "sub" è il nome e il percorso del modulo (per semplicità diciamo che sono la stessa cosa)

L'altro modo, se non è possibile creare tag o filiali nel repository remoto, è quello di cercare il commit che si desidera in un ciclo:

git submodule init 
id=$(git submodule status|sed -ne 's/.\([a-z0-9]*\) sub.*/\1/p' 
git clone --depth 1 --separate-git-dir -n .git/modules/sub/ repository sub  
cd sub 
while ! git rev-list $id ; do 
    git fetch --depth $((i+=1)) 
done 
git checkout $id 

si potrebbe incrementare con più di un commit alla volta per farlo andare più veloce, ma si potrebbe finire con alcuni impegni precedenti rispetto a quello che si desidera.

+0

Ehi. grazie per il suggerimento, sembra che sia vicino a quello che sto cercando. Sai se è possibile clonare un tag specifico da remoto, mantenendo il clone il più superficiale possibile? Il --depth 1 funzionerà con il tag ref? –

+0

Scusate per una risposta molto tarda, ricordo che la risposta alla vostra domanda era sì, ma non sono in grado di testarlo di nuovo in questo momento. solo per curiosità, ci hai provato, e ha funzionato come volevi? – kouk

+0

Sì, ci ho provato, e ha funzionato. Tuttavia, ho optato per una diversa configurazione del progetto e ho evitato di utilizzare i sottomoduli per ora. –

Problemi correlati