Frage Git wird keine neuen Submodule initialisieren / synchronisieren / aktualisieren


Hier ist ein Teil des Inhalts meines .gitmodules Datei:

[submodule "src/static_management"]
        path = src/static_management
        url = git://github.com/eykd/django-static-management.git
[submodule "external/pyfacebook"]
        path = external/pyfacebook
        url = http://github.com/sciyoshi/pyfacebook.git

Jedoch, .git/config enthält nur das erste:

[submodule "src/static_management"]
        url = git://github.com/eykd/django-static-management.git

Das zweite Submodul (external/pyfacebook) wurde von einem anderen Entwickler in einem Feature-Zweig hinzugefügt. Ich habe die Entwicklung jetzt geerbt und den Feature-Zweig ausgecheckt. Allerdings wird Git das Submodul nicht für mich ziehen. Ich habe es versucht:

  • git submodule init
  • git submodule update
  • git submodule update --init
  • git submodule sync
  • Entfernen aller Submoduldefinitionen aus .git/config und läuft git submodule init. Es kopiert nur das vorher existierende Submodul und ignoriert das neue Submodul.
  • Eingabe neuer Submoduldefinitionen in .git/config manuell und läuft git submodule update. Nur die vorher existierenden Submodule aktualisieren sich.

in verschiedenen Kombinationen, aber git wird einfach nicht aktualisiert .git/config basierend auf den neuen Inhalten von .gitmodulesnoch wird es das schaffen external/pyfacebook Ordner und ziehen Sie den Inhalt des Submoduls.

Was vermisse ich? Ist ein manueller Eingriff (Hinzufügen eines Submoduleintrags von Hand zu .git/config) wirklich benötigt, und warum?

Bearbeiten: Manueller Eingriff funktioniert nicht. Manuelles Hinzufügen des neuen Submoduleintrags zu .git/config macht nichts. Das neue Submodul wird ignoriert.


76
2017-07-26 16:47


Ursprung


Antworten:


Haben Sie kürzlich auf git Version 1.7.0.4 aktualisiert? Ich habe und habe jetzt ähnliche Probleme ...

Edit: Ich habe mein Problem behoben, habe aber absolut keine Ahnung wo das Problem lag. Ich habe Submoduleinträge sowohl von .git / config als auch .gitmodules manuell entfernt und meine Submodule mit den üblichen Schritten neu hinzugefügt (git submodule add etc ...) ... Worksforme, fügt aber diesem Thread keinen Wert hinzu.


28
2017-08-26 16:10



Ich hatte das gleiche Problem - es stellte sich heraus, dass die .gitmodules-Datei festgeschrieben wurde, aber das tatsächliche Submodul-Commit (d. H. Der Datensatz der Commit-ID des Submoduls) nicht.

Es manuell hinzuzufügen, schien den Trick zu machen - z.B .:

git submodule add http://github.com/sciyoshi/pyfacebook.git external/pyfacebook

(Auch ohne etwas von .git / config oder .gitmodules zu entfernen.)

Dann verpflichten Sie es, die ID richtig aufzuzeichnen.

Hinzufügen weiterer Kommentare zu dieser funktionierenden Antwort: Wenn das git submodul init oder git submodul update nicht funktioniert, dann sollte git submodul add URL versuchen, wie oben beschrieben. Man kann das durch überprüfen

 git config --list

und man sollte einen Eintrag des Submoduls bekommen, das man in das Ergebnis des Befehls git config --list ziehen möchte. Wenn im config-Ergebnis ein Eintrag Ihres Submoduls vorhanden ist, sollte nun das übliche git submodule update --init Ihr Submodul ziehen. Um diesen Schritt zu testen, können Sie das Submodul manuell umbenennen und anschließend das Submodul aktualisieren.

 mv yourmodulename yourmodulename-temp
 git submodule update --init

Um herauszufinden, ob Sie lokale Änderungen im Submodul haben, kann es über git status -u (wenn Sie Änderungen im Submodul sehen wollen) oder git status --ignore-Submodule (falls Sie die Änderungen nicht sehen wollen) angezeigt werden das Submodul).


64
2018-01-28 23:58



git Version 2.7.4. Dieser Befehl aktualisiert den lokalen Code git submodule update --init --force --remote


34
2017-11-21 11:15



Hatte das gleiche Problem, wenn Git ignoriert init und update Befehle und tut nichts.

WIE REPARIERT MAN

  1. Ihr Submodulordner sollte in git repo festgeschrieben werden
  2. Es sollte nicht in .gitignore sein

Wenn diese Anforderungen erfüllt sind, wird es funktionieren. Andernfalls werden alle Befehle ohne Nachrichten und Ergebnis ausgeführt.

Wenn Sie all das getan haben, und es immer noch nicht funktioniert:

  1. Submodul manuell hinzufügen, z. git submodule add git@... path/to
  2. git submodule init
  3. git submodule update
  4. Commit und Push alle Dateien - .gitmodules und Ihr Modulordner (beachten Sie, dass der Inhalt des Ordners nicht festgeschrieben wird)
  5. Lass dein lokales Git Repo fallen
  6. Klone einen neuen
  7. sicher gehen, dass .git/config hat noch keine Submodule
  8. Jetzt, git submodule init - und Sie werden eine Nachricht sehen, dass das Modul registriert ist
  9. git submodule update - holt das Modul
  10. Sieh dir jetzt an .git/config und Sie werden registriertes Submodul finden

14
2017-10-27 13:45



Irgendwie magisch, aber heute bin ich gelaufen git submodule init gefolgt von    git submodule sync gefolgt von git submodule update und es begann   ziehe meine Submodule ... Magie? Vielleicht! Dies ist wirklich einer der meisten   Ärgerliche Erfahrungen mit Git ...

Vergiss das. Ich habe es tatsächlich funktionierend gemacht git submodule update --init --recursive. Hoffe das hilft.

PS: Stellen Sie sicher, dass Sie sich im Root-Git-Verzeichnis befinden und nicht im Submodul.


3
2018-05-19 01:10



Es scheint hier (auch) eine Menge Verwirrung in den Antworten zu geben.

git submodule init ist nicht dazu gedacht, magisches Zeug in .git / config (aus .gitmodules) zu generieren. Es ist beabsichtigt, nach dem Klonen des übergeordneten Projekts oder nach einem Commit, das ein zuvor nicht vorhandenes Submodul hinzufügt, etwas in einem vollständig leeren Unterverzeichnis einzurichten.

Mit anderen Worten, du folgst einem git clone eines Projekts, das Submodule (die Sie durch die Tatsache wissen, dass der Klon eine .gitmodules Datei ausgecheckt hat) von einem git submodule update --init --recursive.

Sie machen nicht Folgen git submodule add ... mit einem git submodule init (oder git submodule update --init), das soll nicht funktionieren. In der Tat wird das Hinzufügen die entsprechende .git / config bereits aktualisieren, wenn die Dinge funktionieren.

BEARBEITEN

Wenn ein zuvor nicht vorhandenes Git-Submodul von jemand anderem hinzugefügt wurde, und Sie a git pull von diesem Commit, dann wird das Verzeichnis dieses Submoduls vollständig leer sein (wenn Sie ausführen git submodule status Der Hashwert des neuen Submoduls sollte sichtbar sein, hat aber ein - davor.) In diesem Fall musst du deiner folgen git pull auch mit einem git submodule update --init (Plus --recursive wenn es sich um ein Submodul innerhalb eines Submoduls handelt), um das neue, zuvor nicht existierende Submodul ausgecheckt zu bekommen; genauso wie nach einem ersten Klon eines Projekts mit Submodulen (wo Sie diese Submodule natürlich vorher auch nicht hatten).


3
2017-12-27 17:52



Laut der Antwort von Dave James Miller kann ich bestätigen, dass es für mich funktioniert hat. Wichtig dabei war, die Sub-Commit-ID zu übergeben. Nur der Eintrag in .gitmodules war nicht genug.

Hier ist eine angemessene Verpflichtung:

https://github.com/dirkaholic/vagrant-php-dev-box/comitt/d5f4c40bdbd80eefbb5ac6029823733f591435ae


2
2017-07-15 15:03



Ich hatte das gleiche Problem.

.gitmodules hatte das Submodul, aber nach einem git submodule init Befehl, es war nicht in .git/config.

Es stellt sich heraus, dass der Entwickler, der das Submodul hinzugefügt hat, auch das Untermodulverzeichnis hinzugefügt hat .gitignore Datei. Das funktioniert nicht.


2
2018-01-28 03:44



Genau wie du fand ich, dass Git-Submodul-Sync nicht tut, was Sie erwarten, dass es tut. Nur nach dem Ausführen eines expliziten git submodule addwieder ändert sich eine Submodul-URL.

Also, ich habe dieses Skript eingefügt ~/bin/git-submodule-sync.rb:

https://gist.github.com/frimik/5125436

Und ich verwende die gleiche Logik auch für einige Post-Receive-Git-Deploy-Skripte.

Alles, was ich jetzt tun muss, ist zu bearbeiten .gitmodules, dann führe dieses Skript aus und es funktioniert schließlich wie ich dachte git submodule sync sollte es.


2
2018-03-09 19:36



Als ich das heute sah, hatte ein Entwickler einen Teil des Baumes in ein neues Unterverzeichnis verschoben und es sieht so aus, als ob sein Git-Client die aktualisierten Subprojektregeln nicht in der Baumstruktur aufzeichnete, stattdessen wurden sie nur mit einem Nukleus versehen .gitmodules bezieht sich sowohl auf veraltete Standorte als auch auf Teilprojekte, die im aktuellen Baum nicht mehr existierten.

Fügen Sie die Submodule wieder ein und vergleichen Sie die Commit - Bereiche des Submoduls mit denen in git show $breaking_commit_sha (Suchen Sie nach Zeilen, die mit regulären Ausdrücken übereinstimmen ^-Subproject) nach Bedarf feste Dinge anpassen.


1
2018-04-30 21:00