Sottomodulo Git all’interno di un sottomodulo (sottomoduli annidati)

È ansible che un sottomodulo git sia composto da diversi altri sottomoduli git e il superpo re git per recuperare il contenuto di ogni sottomodulo?

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

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

Quindi tentare di estrarre dalla directory root del super git repo dal git submodule init e quindi git submodule update . Ma questo non riesce a recuperare i sottomoduli.

Come accennato in Retrospectively, aggiungi –recursive a un repository git

 git submodule update --init --recursive 

dovrebbe funzionare.

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

  • git clone --submodule
  • ” Aggiunge retrospettivamente --recursive a un repository git ”
    (con l’ alias $ git config --global alias.cloner = 'clone --recursive' , che evita di oscurare il normale comando git clone )

inamiy indica correttamente l’ git submodule update --init --recursive sottoprogramma git submodule update --init --recursive command, introdotto in commit b13fd5c , sempre in git1.6.5, di Johan Herland ( jherland ) .

E IceFire aggiunge nei commenti :

Se si desidera eseguire il checkout di un solo sottomodulo di un sottomodulo, quindi
git submodule update --init è la strada da percorrere.


(vecchia risposta originale)

Secondo la pagina del manuale

  git submodule update --recursive 

dovrebbe aggiornare qualsiasi sottomodulo annidato. Ma la parte init potrebbe non essere ricorsiva.

A seconda della versione di Git, potresti ricorrere ad un approccio più “di scripting”, con questo articolo che aggiorna ricorsivamente i sottomoduli Git che consente di avviare e aggiornare ricorsivamente:

 #!/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); }