Wie "git Klon" einschließlich Submodule?

1992

Ich versuche, ein Submodul in ein Repo zu integrieren. Das Problem ist, dass beim Klonen des übergeordneten Repos der Submodul-Ordner vollständig leer ist.

Gibt es eine Möglichkeit, dies so zu gestalten, dass git clone parent_repotatsächlich Daten in den Submodul-Ordner gestellt werden?

Zum Beispiel http://github.com/cwolves/sequelize/tree/master/lib/ , nodejs-mysql-nativezeigt auf einem externen git Submodul, aber wenn ich die Kasse sequelizeProjekt, dass Ordner leer ist .

Kennzeichen
quelle
4
Dieser Befehl wäre git clone --recurse-submodules --remote-submodules(Q3 2019 Git 2.23): Er klont und aktualisiert die Submodule in einem Befehl. Siehe meine bearbeitete Antwort unten .
VonC

Antworten:

2976

Ab Version 2.13 von Git --recurse-submoduleskann anstelle von --recursive:

git clone --recurse-submodules -j8 git://github.com/foo/bar.git
cd bar

Anmerkung des Herausgebers: -j8ist eine optionale Leistungsoptimierung, die in Version 2.8 verfügbar wurde und bis zu 8 Submodule gleichzeitig abruft - siehe man git-clone.

Mit Version 1.9 von Git bis Version 2.12 ( -jFlag nur in Version 2.8+ verfügbar):

git clone --recursive -j8 git://github.com/foo/bar.git
cd bar

Mit Version 1.6.5 von Git und höher können Sie Folgendes verwenden:

git clone --recursive git://github.com/foo/bar.git
cd bar

Verwenden Sie für bereits geklonte Repos oder ältere Git-Versionen:

git clone git://github.com/foo/bar.git
cd bar
git submodule update --init --recursive
Mathias Bynens
quelle
123
Gibt es eine Möglichkeit, dieses Verhalten in Ihrem Git-Repository als Standard festzulegen, damit weniger informierte Kloner automatisch ein initialisiertes Submodul erhalten?
NHDaly
11
@NHDaly Leider nein. (Zumindest nicht das ich wüsste.)
Mathias Bynens
6
Und logisch denkender Git-Klon - rekursiv wird auch alle Submodule eines Submoduls füllen, oder?
Jayarjo
3
@NHDaly es scheint nicht: stackoverflow.com/questions/4251940/…
Ciro Santilli 4 病毒 审查 六四 事件 4
5
@toszter: ist es so weise? Was ist, wenn das Holding-Repo eine Version eines Submoduls benötigt, die es nicht ist master ?
Gauthier
498

Sie müssen zwei Dinge tun, bevor ein Submodul gefüllt wird:

git submodule init 
git submodule update
LiraNuna
quelle
8
Ich hatte Angst davor ... es macht keinen Sinn, da Sie in diesem Fall ein Teilprojekt auschecken. Ich verstehe, dass die Submodul-Updates nicht automatisch sind, aber warum wird die gebundene Version nicht automatisch ausgecheckt? Gibt es eine Möglichkeit, dies zu erzwingen? Ich habe ein Projekt mit 3 Ebenen von Submodulen und es scheint absurd, so weit gehen zu müssen, nur um eine Kasse zu machen.
Mark
10
Bitte lesen Sie die git-submodule(1)Manpage ( kernel.org/pub/software/scm/git/docs/git-submodule.html ). Sie werden herausfinden, dass git submodule updateein netter Parameter namens unterstützt wird --recursive.
Joschi
95
Warum nicht einfach beide in einem Befehl ausführen? git submodule update --init(Siehe auch meine Antwort ).
Mathias Bynens
9
Ich denke, es ist besser, die Frage mit diesen beiden Befehlen zu beantworten. Es erklärt besser, wie die Aufgabe zu erfüllen ist.
schmijos
6
@MathiasBynens Ein Computer, bei dem ich mich gerade angemeldet habe, hat nur Git 1.5.5.6, das den verkürzten Befehl anscheinend nicht unterstützt, ihn aber als zwei Befehle unterstützt.
Jack Poulson
223

Git 2.23 (Q3 2019): Wenn Sie die Submodule klonen und auf die neueste Version aktualisieren möchten :

git clone --recurse-submodules --remote-submodules

Wenn Sie sie nur an ihrem aufgezeichneten SHA1 klonen möchten:

git clone --recurse-submodules

Siehe unten.


Ursprüngliche Antwort 2010

Wie Joschi in den Kommentaren erwähnt, git submoduleunterstützt jetzt die --recursiveOption (Git1.6.5 und mehr).

Wenn --recursiveangegeben, wird dieser Befehl in die registrierten Submodule zurückgeführt und alle darin enthaltenen verschachtelten Submodule aktualisiert.

Siehe rekursives Arbeiten mit Git-Submodulen für den Init-Teil.
Weitere git submoduleInformationen finden Sie unter Erläuterungen .

Ab Version 1.6.5 von git können Sie dies automatisch tun, indem Sie das Superprojekt mit der folgenden –-recursiveOption klonen :

git clone --recursive git://github.com/mysociety/whatdotheyknow.git

Update 2016 mit Git 2.8: Siehe " Wie kanngit clone --recursive ich das Herunterladen von Git-Submodulen mithilfe von Git beschleunigen / parallelisieren ? "

Sie können das parallele Abrufen des Submoduls mithilfe mehrerer Threads starten.
Zum Beispiel:

git fetch --recurse-submodules -j2

Noch besser ist, dass Sie mit Git 2.23 (Q3 2019) das Submodul in einem Befehl klonen und in den Tracking-Zweig auschecken können!

Siehe Commit 4c69101 (19. Mai 2019) von Ben Avison ( bavison) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit 9476094 , 17. Juni 2019)

clone: --remote-submodulesFlag hinzufügen

Bei der Verwendung git clone --recurse-submodulesgab es bisher keine Möglichkeit, einen --remoteSchalter an den impliziten git submodule updateBefehl für einen Anwendungsfall zu übergeben, in dem die Submodule in ihrem Remote-Tracking-Zweig ausgecheckt werden sollen, anstatt mit dem im Superprojekt aufgezeichneten SHA-1.

Dieser Patch behebt diese Situation.
Es geht tatsächlich --no-fetchum git submodule updateauch auf dem Gelände sie das Submodul hat gerade erst geklont worden, so das Abrufen von der Fernbedienung wieder nur dazu dient, die Dinge verlangsamen.

Das bedeutet:

--[no-]remote-submodules:

Alle geklonten Submodule verwenden den Status des Fernverfolgungszweigs des Submoduls, um das Submodul zu aktualisieren, und nicht den aufgezeichneten SHA-1 des Superprojekts. Entspricht der Weitergabe --remotean git submodule update.

VonC
quelle
3
Git hat also 14 Jahre gebraucht, um die richtige Unterstützung für Submodule hinzuzufügen. Danke für das Update! Was ist, wenn ich bereits einen Klon des Haupt-Repos ohne Submodule und ohne aufgezeichneten SHA1 habe und die neueste Version jedes Submoduls abrufen möchte? Ist es machbar?
Violette Giraffe
1
@VioletGiraffe Wenn dieses geklonte Repository Submodule enthält, hat es "SHA1 aufgezeichnet". Und a git submodule update --init --recursive --remotesollte sie auf das neueste Commit ihrer jeweiligen Niederlassung aktualisieren. (Beispiel: stackoverflow.com/a/56981834/6309 )
VonC
1
Lassen Sie mich anhand eines Beispiels klarstellen: Ich habe ein Vorlagenprojekt auf Github, das Submodule verwendet, und ich habe sogar bestimmte Überarbeitungen der Submodule in dieses Vorlagen-Repo übernommen. Wenn ich jedoch aus diesem Repo ein neues Projekt erstelle, kann ich mit keinem der von Ihnen aufgelisteten Befehle (weder clone --recurse-submodules --remote-submodulesnoch submodule update --init --recursive --remote) die Unterrepos tatsächlich abrufen. Alles, was ich bekomme, ist eine .gitmodules-Datei, und ich konnte keine andere Möglichkeit finden, die Unterrepos zu initiieren, als sie einzeln manuell zu klonen. Ich hätte gerne wenigstens ein Skript dafür submodule foreach...
Violet Giraffe
Wenn Sie eine Lösung kennen, würde ich eine separate Frage stellen, die Sie beantworten könnten. Hier ist das Test-Repo, das ich nur von Hand initiieren
Violet Giraffe
@VioletGiraffe Das liegt daran, dass Sie die .gitmodules hinzugefügt und festgeschrieben haben, aber nicht den gitlink ( stackoverflow.com/a/16581096/6309 , spezielle Einträge im Index: stackoverflow.com/a/19354410/6309 ). Hier ist ein Repository, das dies tut habe den richtigen Gitlink registriert: github.com/tiagomazzutti/antlr4dart
VonC
108

[Schnelle Antwort]

Mit diesem Befehl können Sie Ihr Repo mit allen Submodulen klonen:

git clone --recursive YOUR-GIT-REPO-URL

Wenn Sie das Projekt bereits geklont haben, können Sie Folgendes verwenden:

git submodule init
git submodule update
Javier C.
quelle
33

Wenn Ihr Submodul in einem Zweig hinzugefügt wurde, müssen Sie es in Ihren Klonbefehl aufnehmen ...

git clone -b <branch_name> --recursive <remote> <directory>
Mars Redwyne
quelle
Dies war eher das, wonach ich gesucht habe ... aber die Submodule listen ihren Zweig als "getrennt" auf. :(
AceFunk
28

Versuche dies:

git clone --recurse-submodules

Die Submoduldaten werden automatisch abgerufen, sofern Sie die Submodule bereits zum übergeordneten Projekt hinzugefügt haben.

nweiler
quelle
37
Beachten Sie, dass --recurse-submodulesund --recursivesind gleichwertig Aliase .
Joel Purra
@ SuperUberDuper in diesem Fall können Sie tun, git submodule update --init --recursivewie in dieser Antwort erklärt
Enrico
25

Ich denke, Sie können mit 3 Schritten gehen:

git clone
git submodule init
git submodule update
muhammad ali e
quelle
21

späte Antwort

// git CLONE INCLUDE-SUBMODULES ADDRESS DESTINATION-DIRECTORY
git clone --recursive https://[email protected]/USERNAME/REPO.git DESTINATION_DIR

Da ich gerade eine ganze Stunde mit einem Freund herumgespielt habe: Auch wenn Sie Administratorrechte für BitBucket haben, klonen Sie immer das ORIGINAL-Repository und verwenden Sie das Passwort desjenigen, dem das Repo gehört. Es ist ärgerlich herauszufinden, dass Sie auf diese Minenfalle gestoßen sind: P.

Kaiser
quelle
Genau damit habe ich es zu tun. Wollen Sie damit sagen, dass jeder, der ein Bitbucket-Repository mit Submodulen entwickeln muss, die Anmeldeinformationen des Repository-Erstellers verwenden muss? Blech.
jsleuth
@jsleuth Scheint so - es saugt große Zeit ... und ich weiß es.
Kaiser
Das klingt nach einem Fehler. Hast du es Bitbucket gemeldet?
Mathias Bynens
@MathiasBynens Sind Sie auf dieses Problem gestoßen? Es ist eineinhalb Jahre später und ich weiß eigentlich nicht, ob dies noch der Fall ist.
Kaiser
4
Es beantwortet die OP-Frage nicht beschreibend, beschreibt jedoch einen nicht verwandten Fehler in Bitbucket. Dies könnte übrigens nur verkürzt werden, um "SSH-Schlüsselauthentifizierung zu verwenden".
Treffynnon
18

Versuchen Sie dies, um Submodule in das Git-Repository aufzunehmen.

git clone -b <branch_name> --recursive <remote> <directory>

oder

git clone --recurse-submodules
Radhey Shyam
quelle
18

Sie können das --recursiveFlag beim Klonen eines Repositorys verwenden. Dieser Parameter zwingt git, alle definierten Submodule im Repository zu klonen.

git clone --recursive [email protected]:your_repo.git

Nach dem Klonen können manchmal Zweige von Submodulen geändert werden. Führen Sie anschließend den folgenden Befehl aus:

git submodule foreach "git checkout master"
Ahmad Azimi
quelle
17

[Schnelle Antwort]

Gehen Sie nach dem Klonen des übergeordneten Repos (das einige Submodul-Repos enthielt) wie folgt vor:

git submodule update --init --recursive
Benyamin Jafari
quelle
11

Das parallele Abrufen von Submodulen zielt darauf ab, die zum Abrufen eines Repositorys und aller zugehörigen Submodule erforderliche Zeit zu verkürzen, indem mehrere Repositorys gleichzeitig abgerufen werden können. Dies kann mithilfe der neuen Option --jobs erreicht werden, z.

git fetch --recurse-submodules --jobs=4

Laut Git-Team kann dies die Aktualisierung von Repositorys, die viele Submodule enthalten, erheblich beschleunigen. Wenn Sie --recurse-submodules ohne die neue Option --jobs verwenden, ruft Git die Submodule einzeln ab.

Quelle: http://www.infoq.com/news/2016/03/git28-released

Langer Nguyen
quelle
8

Ich hatte das gleiche Problem für ein GitHub-Repository. In meinem Konto fehlte der SSH-Schlüssel. Der Prozess ist

  1. SSH-Schlüssel generieren
  2. Hinzufügen eines neuen SSH-Schlüssels zu Ihrem GitHub-Konto

Anschließend können Sie das Repository mit Submodulen klonen ( git clone --recursive YOUR-GIT-REPO-URL)

oder

Führen Sie Submodule im bereits geklonten Repository aus git submodule initund git submodule updaterufen Sie sie ab.

Fataler Fehler
quelle
Ja, das ist ein Permission denied (publickey). fatal: Could not read from remote repository.Fehler
Ender
5

Versuche dies.

git clone -b <branch_name> --recursive <remote> <directory>

Wenn Sie das Submodul in einem Zweig hinzugefügt haben, stellen Sie sicher, dass Sie es dem Befehl clone hinzufügen.

Himeshika96
quelle
5

Wenn es sich um ein neues Projekt handelt, können Sie einfach Folgendes tun:

$ git clone --recurse-submodules https://github.com/chaconinc/YourProjectName 

Wenn es bereits installiert ist als:

$ cd YourProjectName (for the cases you are not at right directory) 
$ git submodule init
$ git submodule update
nzrytmn
quelle