Git wird keine neuen Submodule initiieren / synchronisieren / aktualisieren


113

Hier ist ein Teil des Inhalts meiner .gitmodulesDatei:

[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

.git/configEnthält jedoch 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 überprüft. Git wird das Submodul jedoch 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/configund Ausführen git submodule init. Es kopiert nur das zuvor vorhandene Submodul und ignoriert das neue.
  • Neue Submoduldefinitionen .git/configmanuell eingeben und ausführen git submodule update. Nur die zuvor vorhandenen Submodule müssen aktualisiert werden.

in verschiedenen Kombinationen, aber git wird einfach nicht .git/configbasierend auf dem neuen Inhalt von aktualisiert .gitmodules, noch wird es den external/pyfacebookOrdner erstellen und den Inhalt des Submoduls abrufen.

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

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


1
Wenn Sie 1.7.7.1 ausführen und das gleiche Problem haben: "git submodule sync" aktualisiert .git / config nach einer Änderung von .gitmodules nicht.
James Pritts

Antworten:


35

Haben Sie kürzlich ein Upgrade auf Git Version 1.7.0.4 durchgeführt? Ich habe und habe jetzt ähnliche Probleme ...

Bearbeiten: Ich habe mein Problem behoben, habe aber absolut keine Ahnung, wo das Problem war. Ich habe manuell Submoduleinträge aus .git / config und .gitmodules entfernt und meine Submodule mit den üblichen Schritten (git submodule add etc ...) neu hinzugefügt ... Worksforme, aber diesem Thread wird kein Wert hinzugefügt.


Ich bin gerade auf 1.7.2, aber ich glaube, dass ich das Problem seit mindestens 1.6.x habe.
David Eyk

Und ja, wenn ich darüber nachdenke, musste ich schließlich tun, was Sie beschreiben (ich habe vergessen, dass diese Frage noch offen war!). Wenn es Ihnen nichts ausmacht, Ihre Antwort ein wenig aufzupolieren, werde ich sie akzeptieren.
David Eyk

8
Dies ist eine anhaltende Schwäche von Git. Sogar SVN ist besser mit externen.
Peter DeWeese

3
Ich glaube, ich bin auch gerade darauf gestoßen (dieselben Schritte scheinen es endlich zu beheben). Das einzige, was mir aufgefallen ist, ist, nachdem ich es erneut hinzugefügt und dann festgeschrieben habe, das Festschreiben lautete: Erstellungsmodus 160000 lib / jruby-Swing-Helfer (huh?)
Rogerdpack

1
Über den "Erstellungsmodus 160000" sagt das Pro Git-Buch Folgendes: "Beachten Sie den 160000-Modus für den Rack-Eintrag. Dies ist ein spezieller Modus in Git, der im Grunde bedeutet, dass Sie ein Commit als Verzeichniseintrag und nicht als Unterverzeichnis oder a aufzeichnen Datei." git-scm.com/book/en/Git-Tools-Submodules
Johann

92

Ich hatte das gleiche Problem - es stellte sich heraus, dass die .gitmodules-Datei festgeschrieben wurde, die tatsächliche Festschreibung des Submoduls (dh der Datensatz der Festschreibungs-ID des Submoduls) jedoch nicht.

Das manuelle Hinzufügen schien den Trick zu tun - zB:

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

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

Legen Sie es dann fest, um die ID ordnungsgemäß aufzuzeichnen.

Hinzufügen einiger weiterer Kommentare zu dieser funktionierenden Antwort: Wenn das Git-Submodul-Init oder das Git-Submodul-Update nicht funktioniert, sollte die oben beschriebene URL zum Hinzufügen von Git-Submodulen den Trick ausführen. Man kann dies durch überprüfen

 git config --list

und man sollte einen Eintrag des Submoduls erhalten, das man im Ergebnis des Befehls git config --list ziehen möchte. Wenn das Konfigurationsergebnis einen Eintrag Ihres Submoduls enthält, sollte jetzt das übliche Git-Submodul-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, können Sie diese über den Git-Status -u (wenn Sie Änderungen im Submodul sehen möchten) oder den Git-Status --ignore-submodules (wenn Sie die Änderungen in nicht sehen möchten) anzeigen das Submodul).


Wofür ist external/pyfacebook?
IgorGanapolsky

2
@IgorGanapolsky Das ist der Zielpfad für Ihr Submodul.
Yuhua

Das hat mir geholfen, vielen Dank! Ich könnte nur hinzufügen, dass, wenn der Zielpfad bereits vorhanden ist (was für mich aufgrund des Versuchs anderer Befehle der Fall war), die folgende Meldung angezeigt wird, die nur zur Verwirrung 'your/local/path' already exists and is not a valid git repo
Michael Ambrus

1
Ein Liner zum Lesen von Einträgen in "git config --list":git config --list | grep submodule | sed -e "s/submodule\.//" -e "s/\(.*\)\.url=\(.*\)/git submodule add --force \2 \1/" | bash
Puggan Se

64

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


20
Nichts für mich tun.
Carlo Wood

1
In Bezug auf git-submodule [Dokumentation] ( git-scm.com/docs/git-submodule#git-submodule---remote ) sollte der oben genannte Befehl den lokalen Zweig der Submodule aktualisieren.
Palik

1
@palik du rockst!
Denis Trofimov

1
Sie können einzelne Module mit aktualisieren git submodule update --init --force --remote <module-name>.
Adam Faryna

15

Hatte das gleiche Problem, als Git ignoriert initund updatebefiehlt und nichts tut.

WIE REPARIERT MAN

  1. Ihr Submodul-Ordner 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 Meldungen und Ergebnisse ausgeführt.

Wenn Sie das alles 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. Übertragen und pushen Sie alle Dateien - .gitmodulesund Ihren Modulordner (beachten Sie, dass der Inhalt des Ordners nicht festgeschrieben wird).
  5. Lass dein lokales Git Repo fallen
  6. Klonen Sie einen neuen
  7. Stellen Sie sicher, dass .git/confignoch keine Submodule vorhanden sind
  8. Jetzt git submodule init- und Sie sehen eine Meldung, dass das Modul registriert wurde
  9. git submodule update - holt das Modul
  10. Schauen .git/configSie sich jetzt an und Sie finden ein registriertes Submodul

1
Ich glaube, der Pfad zu den Submodulen kann in .gitignore sein. Zumindest habe ich es geschafft, indem ich der Antwort von @DaveJamesMiller gefolgt bin. Sonst hat bei mir nichts funktioniert.
Gebbissimo

7

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

git submodule initist nicht dazu gedacht, Dinge in .git / config (aus .gitmodules) auf magische Weise zu generieren. Es ist beabsichtigt, etwas in einem völlig leeren Unterverzeichnis einzurichten, nachdem das übergeordnete Projekt geklont oder ein Commit abgerufen wurde, das ein zuvor nicht vorhandenes Submodul hinzufügt.

Mit anderen Worten, Sie folgen einem git cloneProjekt mit Submodulen (was Sie daran erkennen, dass der Klon eine .gitmodules-Datei ausgecheckt hat) durch a git submodule update --init --recursive.

Sie nicht folgen git submodule add ...mit einem git submodule init(oder git submodule update --init), das nicht funktionieren sollte. Tatsächlich aktualisiert das Hinzufügen bereits die entsprechende .git / config, wenn die Dinge funktionieren.

BEARBEITEN

Wenn ein zuvor nicht vorhandenes Git-Submodul von einer anderen Person hinzugefügt wurde und Sie einen git pulldieser Commits ausführen, ist das Verzeichnis dieses Submoduls vollständig leer (wenn Sie git submodule statusden Hash des neuen Submoduls ausführen, sollte der Hash sichtbar sein, aber ein -vor it.) In diesem Fall müssen Sie Ihrem git pullauch ein git submodule update --init(plus, --recursivewenn es sich um ein Submodul innerhalb eines Submoduls handelt) folgen , um das neue, zuvor nicht vorhandene Submodul auszuchecken. Genau wie nach einem ersten Klon eines Projekts mit Submodulen (wo Sie diese Submodule offensichtlich auch vorher nicht hatten).


1
Das ist interessant, weil git help submoduledies über init sagt: "init: Initialisiert die im Index aufgezeichneten Submodule (die an anderer Stelle hinzugefügt und festgeschrieben wurden), indem Submodulnamen und URLs von .gitmodules nach .git / config kopiert werden." Es klingt also so, als ob es genau das tun sollte, was Sie sagen, dass es nicht tut ...? Zeit für ein Update der Git-Dokumentation?
Brad

@brad Ich glaube nicht, dass ich das gesagt habe - aber ich habe eine Klarstellung für diesen speziellen Fall hinzugefügt. Vielen Dank.
Carlo Wood

@CarloWood eine Idee, warum die Autoren von Git-Submodulen entschieden, dass --initdies notwendig sein sollte, um neue Submodule zu bekommen (anstatt sie automatisch zu greifen update)? Es scheint, als sollte die Aktualisierung Ihres Repositorys alles Notwendige abrufen, es sei denn, dies würde Daten zerstören. Damit müssen --initSie wissen, dass möglicherweise neue Submodule erstellt wurden, oder es wird immer --initjedes Mal ein ausgegeben. In diesem Fall scheint es wieder so, als ob es standardmäßig aktiviert sein sollte.
Catskul

@Catskul Natürlich habe ich keine Ahnung, warum die Autoren von Git-Submodulen irgendetwas entschieden haben, aber ich vermute, dass "Update" für die Aktualisierung von bereits vorhandenen Objekten reserviert ist und "init" verwendet wird, um etwas (lokal) Neues zu erstellen. Unter der Haube unterscheiden sich die beiden wahrscheinlich erheblich genug, um einen anderen Befehl zu rechtfertigen.
Carlo Wood

6

Ich hatte das gleiche Problem, aber keine der oben genannten Lösungen hat geholfen. Die Einträge in den .gitmodules und in .git / config waren richtig, aber der Befehl hat git submodules update --init --recursivenichts getan. Ich habe auch das Submodul-Verzeichnis entfernt und es ausgeführt git submodules update --init --recursiveund das Submodul-Verzeichnis zurückbekommen, aber mit genau dem gleichen Commit wie zuvor.

Ich habe die Antwort auf dieser Seite gefunden . Der Befehl lautet:git submodule update --remote


2
Dies war auch die richtige Lösung für mich. Ich rannte git submodule updatestatt git submodule update --remote.
Andrew Medlin

5

Irgendwie magisch, aber heute bin ich gelaufen, git submodule initgefolgt von git submodule syncgefolgt git submodule updateund es hat angefangen, meine Submodule zu ziehen ... Magie? Vielleicht! Dies ist wirklich eine der nervigsten Erfahrungen mit Git…

Vergiss das. Ich habe es tatsächlich zum Laufen gebracht git submodule update --init --recursive. Hoffe das hilft.

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


7
Nein, das tut absolut nichts für mich.
IgorGanapolsky

@IgorGanapolsky Ich habe die Antwort oben mit dem bearbeitet, was für mich funktioniert hat. Lass mich wissen ob es funktioniert!
Levi Figueira

Ich habe Ihre neuen Befehle ausprobiert, aber sie haben auch nichts getan.
IgorGanapolsky

5

Zu denken, dass manuelles Einrichten .gitmodulesausreicht, ist FALSCH

Mein Einheimischer git version 2.22.0zum Zeitpunkt dieses Schreibens.

Also kam ich zu diesem Thread und fragte mich, warum es nicht git submodule initfunktionierte. Ich habe die .gitmodulesDatei eingerichtet und fortgefahren git submodule init...

WICHTIG

  1. git submodule add company/project.git includes/projectDies ist erforderlich (beim erstmaligen Hinzufügen des Moduls).

    • Konfiguration hinzufügen zu .git/config
    • Aktualisieren Sie die .gitmodulesDatei
    • Verfolgen Sie den Standort des Submoduls ( includes/projectin diesem Beispiel).
  2. Sie müssen dann , git commitnachdem Sie das Modul hinzugefügt haben, wird dies begehen .gitmodulesund die nachgeführte Submodul Lage.

Wenn das Projekt erneut geklont wird, enthält es das .gitmodulesVerzeichnis und das leere Submodulverzeichnis (z. B. includes/projectin diesem Beispiel). Zu diesem Zeitpunkt .git/configgibt es noch keine Submodul-Konfiguration, bis sie ausgeführt git submodule initwird. Denken Sie daran, dass dies nur funktioniert, weil .gitmodulesAND includes/projectim Haupt-Git-Repo verfolgt wird.

Auch als Referenz siehe:



3

Ich hatte das gleiche Problem.

.gitmoduleshatte das Submodul, aber nach einem git submodule initBefehl war es nicht in .git/config.

Es stellte sich heraus, dass der Entwickler, der das Submodul hinzugefügt hat, der .gitignoreDatei auch das Submodulverzeichnis hinzugefügt hat . Das geht nicht


2

Genau wie Sie habe ich festgestellt, dass die Git-Submodul-Synchronisierung nicht das tut, was Sie erwarten. Erst nach git submodule adderneuter expliziter Ausführung ändert sich eine Submodul-URL.

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

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

Und ich verwende dieselbe Logik auch für einige Git-Bereitstellungsskripte nach dem Empfang.

Jetzt muss ich nur noch bearbeiten .gitmodules, dann dieses Skript ausführen und es funktioniert endlich so, wie ich es mir vorgestellt git submodule synchatte.


Dies scheint nur bei einigen Repos zu passieren ... möglicherweise aufgrund eines Fehlers in Git. Es ist mir schon lange nicht mehr in neu erstellten Repositories passiert , aber vor langer Zeit passierte es immer wieder in bestimmten Repos ...
Freitag,

2

Ich hatte heute das gleiche Problem und fand heraus, dass ich, weil ich damals tippte, git submodule initdiese Zeile in meinem hatte .git/config:

[submodule]
   active = .

Ich entfernte das und tippte:

git submodule update --init --remote

Und alles war wieder normal, mein Submodul wurde wie gewohnt in seinem Unterverzeichnis aktualisiert.


2

Das Problem für mich ist, dass der vorherige Entwickler des Repos den submodules/thingOrdner als normalen Ordner festgeschrieben hat. Wenn ich also versuchte, ihn auszuführen git submodule add ..., schlug er fehl mit: Der 'submodules/thing' already exists in the indexVersuch, das Submodul zu aktualisieren, schlug ebenfalls fehl, da der Pfad dies nicht tat ein Submodul enthalten.

Um dies zu beheben, musste ich den submodules/thingOrdner löschen , den Löschvorgang festschreiben und dann den git submodule addBefehl ausführen , um ihn wieder korrekt hinzuzufügen:

git submodule add --force --name thing https://github.com/person/thing.git submodules/thing

1

Als ich dies heute sah, hatte ein Entwickler einen Teil des Baums in ein neues Unterverzeichnis verschoben, und es sieht so aus, als hätte sein Git-Client die aktualisierten Teilprojektregeln nicht im Baum aufgezeichnet, sondern sie wurden nur mit Atomwaffen versehen, sodass .gitmodulesbeide veraltet waren Standorte und Teilprojekte, die im aktuellen Baum nicht mehr vorhanden waren.

Hinzufügen der Submodule wieder in und Vergleichen der Commit-Shas des Submoduls mit denen in git show $breaking_commit_sha(Suche nach Zeilen, die mit regulärem Ausdruck übereinstimmen ^-Subproject), um nach Bedarf feste Dinge anzupassen.


1

Das Löschen des Submodulverzeichnisses und seines Inhalts (Ordner "external / pyfacebook"), falls es zuvor vorhanden war, git submodule add ...kann Probleme beheben.


1
Das war das Problem für mich. Jemand hatte den Ordner "submodule" nur als regulären Ordner festgeschrieben. Wenn ich also versuchte, "git submodule add ..." auszuführen, schlug dies fehl mit: "'vendor / mobx-state-tree' ist bereits im Index vorhanden." Der Versuch, das Submodul zu aktualisieren, schlug ebenfalls fehl, da festgestellt wurde, dass der Pfad kein Submodul enthielt. Um dies zu beheben, musste ich den Ordner löschen, den Löschvorgang festschreiben und dann den Befehl git add ausführen, um ihn wieder korrekt hinzuzufügen.
Venryx

1

Ich hatte ein ähnliches Problem mit einem Submodul. Es wollte einfach nicht geklont / gezogen / aktualisiert / was auch immer.

Beim Versuch, das Submodul mithilfe von erneut hinzuzufügen, git submodule add git@my-repo.git destinationwurde die folgende Ausgabe angezeigt:

A git directory for 'destination' is found locally with remote(s):
  origin        git@my-repo.git
If you want to reuse this local git directory instead of cloning again from
  git@my-repo.git
use the '--force' option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the '--name' option.

Also habe ich versucht , den Befehl add zu erzwingen :
git submodule add --force git@my-repo.git destination

Das hat in meinem Fall funktioniert.


0

Für die Aufzeichnung:
Ich habe das gleiche Problem erstellt, indem ich ein leeres Repository als Submodul hinzugefügt habe . In diesem Fall war kein Referenz-Hash für das Submodul verfügbar, was zu dem im Originalposter beschriebenen Fehler führte.

Das erzwungene Hinzufügen des Repositorys nach dem Festschreiben hat das Problem behoben (wie im Beitrag von Arvids).
git submodule add --force git@my-repo.git destination


0
  • Entfernen Sie das Submodul von Ihrem .git/config
  • git submodule initBefehl ausführen
  • Gehen Sie zu Ihrem Submodulverzeichnis und führen Sie es aus git pull origin master

Es sollte jetzt funktionieren


0

Teilen Sie einfach mit, was für mich funktioniert hat:

git clone --recurse-submodules <repository path>

Dadurch wird das Remote-Repository geklont, das bereits die Submodule enthält. Dies bedeutet, dass Sie nach dem Klonen kein Git-Submodul-Update oder Init ausführen müssen.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.