Git sottomodulo all'interno di un sottomodulo (sottomoduli annidati)


137

È possibile che un sottomodulo git sia composto da molti altri sottomoduli git e il repository super git recuperi il contenuto per ciascun sottomodulo?

Ho provato a farlo usando l'approccio ovvio / ingenuo di creare un repository git contenente diversi sottomoduli.

Quindi aggiungendo questo repository git a un altro repository git come sottomodulo.

Quindi tentando di estrarre dalla directory principale del repository super git entro git submodule inite poi git submodule update. Ma questo non riesce a recuperare i sottomoduli.


Ti suggerisco di usare TortoiseGit: usalo nella tua radice e poi chiedigli di aggiornare tutti i sottomoduli con Inizializza, Ricorsivo, Forza selezionata!
serup

Risposte:


211

Come menzionato in Retrospettivamente aggiungere --recursive a un repository git

git submodule update --init --recursive

dovrebbe funzionare.


13
Questo ha funzionato per me. Nota che ho erroneamente pensato che git submodule init; git submodule update --recursivefosse sinonimo di quanto sopra, ma non lo è.
jsdalton,

+1 Mi piace molto meglio di quello che stavo usando: git submodule foreach git submodule init ... quindi git submodule update --recursive
Joseph DeCarlo

Purtroppo questo non ha funzionato per me. Nessun errore, nessun messaggio, niente.
Luís de Sousa,

Come si aggiornano questi repository completamente nidificati? Quando passo la --initbandiera, i sottomoduli, all'interno di uno dei miei sottomoduli, vengono inizializzati alle vecchie versioni, non a quelle più attuali.
yoaquim,

Lo faccio git submodule foreach git pull origin master, e funziona parzialmente: i sottomoduli vengono aggiornati, ma a volte HEADviene rimosso e per i sottomoduli all'interno dei sottomoduli, non posso eseguire il commit delle modifiche del mio sottomodulo diretto perché ha "contenuto modificato" non "nuovi commit" (poiché i suoi sottomoduli hanno "nuovi commit" e vengono aggiornati).
Yoaquim,

55

Come Sridhar commenta di seguito, da Git1.6.5 +, git clone --recursiveè ora l'alternativa ufficiale, descritta in:

inamiy indica correttamente il git submodule update --init --recursivecomando, introdotto in commit b13fd5c , sempre in git1.6.5, di Johan Herland ( jherland) .

E IceFire aggiunge nei commenti :

Se desideri effettuare il checkout di un solo sottomodulo di un sottomodulo, allora
git submodule update --init <submoduleName>è la strada da percorrere.


(risposta originale precedente)

Secondo la pagina del manuale

 git submodule update --recursive

dovrebbe aggiornare tutti i sottomoduli nidificati. Ma la parte init potrebbe non essere ricorsiva.

A seconda della versione di Git, è possibile ricorrere ad un approccio più "scripting", con questo articolo Aggiornamento ricorsivo dei sottomoduli Git che consente l'inizializzazione ricorsiva e l'aggiornamento:

#!/usr/bin/perl

use strict;
use Cwd;

init_and_update();

exit;

sub init_and_update
{
    my $start_path = cwd();

    my %paths;
    my $updated;

    do
    {
        my $data = `find . -name '.gitmodules'`;
        chomp($data);

        $data =~ s/\/\.gitmodules//g;

        foreach my $path (split(/\n/, $data))
        {
            $paths{$path} = '' if($paths{$path} eq '');
        }

        $updated = 0;

        foreach my $path (sort keys %paths)
        {
            if($paths{$path} eq '')
            {
                chdir($path);
                `git submodule init 2>&1`;
                `git submodule update 2>&1`;
                chdir($start_path);

                if($ARGV[0] eq '--remove-gitmodules')
                {
                    unlink("$path/.gitmodules");
                }

                $paths{$path} = 1;

                $updated++;
            }
        }
    } while($updated);
}

1
Non è git clone --recursivesufficiente?
Sridhar Ratnakumar,

@Sridhar: è, per la clonazione, come menzionato in stackoverflow.com/questions/3796927/git-clone-submodule e stackoverflow.com/questions/4251940/... , da Git1.6.5 e successivamente. Ho modificato la mia risposta per riflettere ciò.
VonC,

Nota: se desideri effettuare il checkout di un solo sottomodulo di un sottomodulo, git submodule update --init <submoduleName>è la strada da percorrere; Sono arrivato qui mentre cercavo questa risposta
IceFire,

1
@IceFire Grazie. Ho incluso il tuo commento nella risposta per una maggiore visibilità.
VonC,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.