Git-Submodul innerhalb eines Submoduls (verschachtelte Submodule)

137

Ist es möglich, dass ein Git-Submodul aus mehreren anderen Git-Submodulen besteht und das Super-Git-Repo den Inhalt für jedes Submodul abruft?

Ich habe versucht, dies mit dem offensichtlichen / naiven Ansatz zu tun, ein Git-Repo mit mehreren Submodulen zu erstellen.

Fügen Sie dann dieses Git-Repo einem anderen Git-Repo als Submodul hinzu.

Versuchen Sie dann, von git submodule initund dann aus dem Stammverzeichnis des Super-Git-Repos zu ziehen git submodule update. Dadurch können die Sub-Submodule jedoch nicht abgerufen werden.

erster Rückmelder
quelle
Ich schlage vor, dass Sie TortoiseGit verwenden - verwenden Sie es in Ihrem Stammverzeichnis und bitten Sie es dann, alle Submodule mit aktiviertem Initialisieren, Rekursiv, Erzwingen zu aktualisieren!
Serup

Antworten:

211

Wie in Rückblickend hinzugefügt - rekursiv zu einem Git-Repo hinzufügen

git submodule update --init --recursive

sollte arbeiten.

inamiy
quelle
13
Das hat bei mir funktioniert. Beachten Sie, dass ich fälschlicherweise dachte, das git submodule init; git submodule update --recursivesei gleichbedeutend mit dem oben Gesagten, aber das ist es nicht.
Jsdalton
+1 Ich mag das viel besser als das, was ich verwendet habe: Git-Submodul für jedes Git-Submodul init ... dann Git-Submodul-Update
Joseph DeCarlo
Leider hat das bei mir nicht funktioniert. Keine Fehler, keine Nachrichten, nichts.
Luís de Sousa
Wie aktualisieren Sie diese vollständig verschachtelten Repos? Wenn ich das --initFlag übergebe, werden die Submodule in einem meiner Submodule nur auf alte Versionen initialisiert, nicht auf die aktuellsten.
Yoaquim
Das tue ich git submodule foreach git pull origin masterund es funktioniert teilweise: Submodule werden aktualisiert, aber manchmal wird das HEADgetrennt und für Submodule innerhalb von Submodulen kann ich die Änderungen meines direkten Submoduls nicht festschreiben, da es "geänderten Inhalt" und keine "neuen Commits" hat (da seine eigenen Submodule haben "neue Commits" und werden aktualisiert).
Yoaquim
55

Wie Sridhar unten kommentiert, ist Git1.6.5 + git clone --recursivenun die offizielle Alternative, beschrieben in:

inamiy weist korrekt auf den git submodule update --init --recursiveBefehl hin, den Johan Herland ( ) in commit b13fd5c , ebenfalls in git1.6.5, eingeführt hat .jherland

Und IceFire fügt in den Kommentaren hinzu :

Wenn Sie nur ein Submodul eines Submoduls auschecken möchten,
git submodule update --init <submoduleName>ist dies der richtige Weg.


(ältere ursprüngliche Antwort)

Laut Handbuchseite

 git submodule update --recursive

sollte alle verschachtelten Submodule aktualisieren. Der Init-Teil ist jedoch möglicherweise nicht rekursiv.

Abhängig von Ihrer Version von Git können Sie mit diesem Artikel auf rekursives Aktualisieren von Git-Submodulen zurückgreifen, um rekursives Init und Aktualisieren zu ermöglichen:

#!/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);
}
VonC
quelle
1
Ist das nicht git clone --recursiveausreichend
Sridhar Ratnakumar
@Sridhar: Zum Klonen, wie in stackoverflow.com/questions/3796927/git-clone-submodule und stackoverflow.com/questions/4251940/… erwähnt , ab Git1.6.5 und höher. Ich habe meine Antwort bearbeitet, um dies widerzuspiegeln.
VonC
Hinweis: Wenn Sie nur ein Submodul eines Submoduls auschecken möchten, git submodule update --init <submoduleName>ist dies der richtige Weg. Ich bin hierher gekommen, als ich nach dieser Antwort
gesucht habe
1
@ IceFire Danke. Ich habe Ihren Kommentar zur besseren Sichtbarkeit in die Antwort aufgenommen.
VonC