it-swarm.com.de

Git wird keine neuen Submodule initialisieren/synchronisieren/aktualisieren

Hier ist ein Teil des Inhalts meiner .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

.git/config enthält jedoch nur die 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 Funktionszweig ausgecheckt. 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/config und Ausführen von git submodule init. Es kopiert nur das zuvor vorhandene Submodul und ignoriert das neue.
  • Neue Submoduldefinitionen manuell in .git/config eingeben und git submodule update ausführen. Nur die zuvor vorhandenen Submodule müssen aktualisiert werden.

in verschiedenen Kombinationen, aber git aktualisiert .git/config einfach nicht anhand des neuen Inhalts von .gitmodules und erstellt auch nicht den Ordner external/pyfacebook und zieht den Inhalt des Submoduls. 

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

Edit: Manuelle Intervention funktioniert nicht. Das manuelle Hinzufügen des neuen Submoduleintrags zu .git/config führt zu nichts. Das neue Submodul wird ignoriert.

84
David Eyk

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

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

31
Quickredfox

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

Das manuelle Hinzufügen schien den Trick zu erfüllen - z.

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

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

Dann verpflichten Sie sich, um die ID ordnungsgemäß aufzuzeichnen.

Hinzufügen weiterer Kommentare zu dieser Antwort: Wenn das Update für git submodule init oder git submodule nicht funktioniert, sollte git submodule add url den Trick ausführen. Man kann das durch überprüfen 

 git config --list

und man sollte einen Eintrag des Submoduls erhalten, in das das Ergebnis des Befehls git config --list geladen werden soll. Wenn im Konfigurationsergebnis ein Eintrag Ihres Submoduls enthalten ist, sollte jetzt das übliche Update des git-Submoduls --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 dies über git status -u (wenn Sie Änderungen im Submodul sehen möchten) oder git status --ignore-submodules (wenn Sie die Änderungen nicht sehen möchten) sehen das Modul).

71

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

42
palik

Hatte das gleiche Problem, als git die Befehle init und update ignorierte und nichts tat.

WIE REPARIERT MAN

  1. Ihr Submodule-Ordner sollte in git repo festgelegt werden
  2. Es sollte nicht in .gitignore sein

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

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

  1. Fügen Sie das Submodul manuell hinzu, z. git submodule add [email protected] path/to
  2. git submodule init
  3. git submodule update
  4. commit und Push all files - .gitmodules und Ihr Modulordner (beachten Sie, dass der Inhalt des Ordners nicht festgelegt wird)
  5. lass dein lokales Git Repo fallen
  6. ein neues klonen
  7. stellen Sie sicher, dass .git/config noch keine Submodule hat
  8. Nun git submodule init - und Sie sehen eine Nachricht, die das Modul registriert hat
  9. git submodule update - ruft das Modul ab
  10. Schauen Sie sich jetzt .git/config an und Sie finden registrierte Submodule
14
Alex Ivasyuv

Irgendwie magisch, aber heute lief ich 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 am meisten ärgerliche Erfahrungen mit Git…

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

PS: Vergewissern Sie sich, dass Sie sich im Stammverzeichnis von git und nicht im Untermodul befinden.

3
Levi Figueira

In den Antworten scheint es (auch) eine Menge Verwirrung zu geben.

git submodule init ist not soll in .git/config (aus .gitmodules) zauberhaft Sachen erzeugen. Es ist beabsichtigt, etwas in einem vollständig leeren Unterverzeichnis einzurichten, nachdem das übergeordnete Projekt geklont oder ein Commit ausgeführt wurde, durch das ein zuvor nicht vorhandenes Untermodul hinzugefügt wird.

Mit anderen Worten, Sie folgen einem git clone eines Projekts, das über Submodule verfügt (die Sie daran erkennen, dass der Klon eine .gitmodules-Datei ausgecheckt hat) anhand eines git submodule update --init --recursive.

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

EDIT

Wenn ein zuvor nicht vorhandenes git-Submodul von einer anderen Person hinzugefügt wurde und Sie einen git pull dieses Commits ausführen, ist das Verzeichnis dieses Submoduls vollständig leer (wenn Sie git submodule status ausführen, sollte der Hash des neuen Submoduls sichtbar sein, er hat jedoch einen - davor.) In diesem Fall müssen Sie Ihrem git pull auch einen git submodule update --init (plus --recursive, wenn es sich um ein Submodul innerhalb eines Submoduls handelt) folgen, damit das neue, bisher nicht vorhandene Submodul ausgecheckt wird. So wie nach einem ersten Klon eines Projekts mit Submodulen (wo Sie offensichtlich auch diese Submodule nicht hatten).

3
Carlo Wood

Ich hatte das gleiche Problem. 

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

Es stellt sich heraus, dass der Entwickler, der das Submodul hinzugefügt hat, auch das Submodul-Verzeichnis zur .gitignore-Datei hinzugefügt hat. Das geht nicht.

2
joseph.hainline

Genau wie Sie, ich habe festgestellt, dass git submodule sync nicht das tut, was Sie erwarten ... __ erst nachdem Sie explizit git submodule add getan haben, ändert sich eine Submodul-URL.

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

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

Und ich benutze dieselbe Logik auch für ein paar git deploy-Skripts nach dem Empfang.

Jetzt muss ich nur noch .gitmodules editieren, dann dieses Skript ausführen und es funktioniert schließlich so, wie ich dachte, git submodule sync sollte.

2
fridh

Laut der Antwort von Dave James Miller kann ich bestätigen, dass es für mich funktioniert hat. Das Wichtigste war, die Commit-ID der Unterprojekte festzuschreiben. Nur den Eintrag in .gitmodules zu haben, war nicht genug.

Hier ist ein passendes Commit:

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

2
dirkaholic

Ich hatte das gleiche Problem, aber keine der oben genannten Lösungen hat geholfen. Die Einträge in den .git-Modulen und in .git/config stimmten, aber der Befehl git submodules update --init --recursive führte zu nichts. Ich habe auch das Untermodulverzeichnis entfernt und git submodules update --init --recursive ausgeführt und das Untermodulverzeichnis zurückerhalten, jedoch mit genau demselben Commit wie zuvor.

Ich fand die Antwort auf diese Seite . Der Befehl lautet: git submodule update --remote

2
masterop

Als ich das heute sah, hatte ein Entwickler einen Teil des Baums in ein neues Unterverzeichnis verschoben und es sieht so aus, als ob sein git-Client die aktualisierten Teilprojektregeln nicht im Baum aufzeichnete. Stattdessen wurden sie lediglich als "ukode" bezeichnet, sodass .gitmodules auf beide verweist veraltete Standorte und zu Teilprojekten, die nicht mehr im aktuellen Baum vorhanden waren.

Fügen Sie die Submodule wieder hinzu und vergleichen Sie die Commit-Shas des Submoduls mit den in git show $breaking_commit_sha gefundenen (suchen Sie nach Zeilen, die mit dem Ausdruck regexp ^-Subproject übereinstimmen), um sie nach Bedarf zu korrigieren.

1
Phil P

Ich hatte heute dasselbe Problem und habe herausgefunden, dass ich diese Zeile in meinem git submodule init hatte, weil ich .git/config eingegeben hatte:

[submodule]
   active = .

Ich entfernte das und tippte ein:

git submodule update --init --remote

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

1
Eric Jeker

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

Beim Versuch, das Submodul mit git submodule add [email protected] destination erneut hinzuzufügen, erhielt ich die folgende Ausgabe:

A git directory for 'destination' is found locally with remote(s):
  Origin        [email protected]
If you want to reuse this local git directory instead of cloning again from
  [email protected]
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 Add-Befehl durchzusetzen:
git submodule add --force [email protected] destination

Das hat in meinem Fall funktioniert.

1
Arvid
  • Entfernen Sie das Submodul aus Ihrem .git/config
  • Führen Sie den Befehl git submodule init aus
  • Gehen Sie in Ihr Untermodulverzeichnis und führen Sie git pull Origin master aus.

Es sollte jetzt klappen

0

Löschen des Untermodulverzeichnisses und seines Inhalts (Ordner "external/pyfacebook"), falls es existiert, bevor git submodule add ... Probleme beheben.

0
atahan

Für das Protokoll:
Ich habe dasselbe Problem erstellt, indem ein empty Repository als Submodul hinzugefügt wurde. In diesem Fall war kein Referenzhash für das Submodul verfügbar, was zu dem vom Originalposter beschriebenen Fehler führte.

Erzwungenes Hinzufügen des Repositorys, nachdem das Problem behoben wurde (wie in Arvids Post)
git submodule add --force [email protected] destination

0
Marc

Zu denken, dass es ausreicht, .gitmodules manuell einzurichten, ist FALSCH

Mein lokaler git version 2.22.0 zum Zeitpunkt dieses Schreibens.

Also kam ich zu diesem Thread und fragte mich, warum git submodule init nicht funktionierte. Ich richte die .gitmodules -Datei ein und fuhr fort, git submodule init zu tun ...

WICHTIG

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

    • add config to .git/config
    • aktualisieren Sie die Datei .gitmodules
    • verfolgen Sie die Position des Submoduls (includes/project in diesem Beispiel).
  2. sie müssen dann git commit, nachdem Sie das Submodul hinzugefügt haben, dies wird .gitmodules und den verfolgten Submodulstandort festschreiben.

Wenn das Projekt erneut geklont wird, enthält es das Verzeichnis .gitmodules und das leere Untermodulverzeichnis (z. B. includes/project in diesem Beispiel). Zu diesem Zeitpunkt hat .git/config noch keine Submodulkonfiguration, bis git submodule init ausgeführt wird. Denken Sie daran, dass dies nur funktioniert, weil .gitmodules UND includes/project im Haupt-Git-Repo verfolgt werden.

Siehe auch als Referenz:

0
farinspace