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 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/config
und Ausführengit submodule init
. Es kopiert nur das zuvor vorhandene Submodul und ignoriert das neue. - Neue Submoduldefinitionen
.git/config
manuell eingeben und ausführengit submodule update
. Nur die zuvor vorhandenen Submodule müssen aktualisiert werden.
in verschiedenen Kombinationen, aber git wird einfach nicht .git/config
basierend auf dem neuen Inhalt von aktualisiert .gitmodules
, noch wird es den external/pyfacebook
Ordner 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/config
macht nichts. Das neue Submodul wird ignoriert.
quelle
Antworten:
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.
quelle
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:
(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
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.
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).
quelle
external/pyfacebook
?'your/local/path' already exists and is not a valid git repo
git config --list | grep submodule | sed -e "s/submodule\.//" -e "s/\(.*\)\.url=\(.*\)/git submodule add --force \2 \1/" | bash
Git Version 2.7.4. Dieser Befehl aktualisiert den lokalen Code
git submodule update --init --force --remote
quelle
git submodule update --init --force --remote <module-name>
.Hatte das gleiche Problem, als Git ignoriert
init
undupdate
befiehlt und nichts tut.WIE REPARIERT MAN
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:
git submodule add git@... path/to
git submodule init
git submodule update
.gitmodules
und Ihren Modulordner (beachten Sie, dass der Inhalt des Ordners nicht festgeschrieben wird)..git/config
noch keine Submodule vorhanden sindgit submodule init
- und Sie sehen eine Meldung, dass das Modul registriert wurdegit submodule update
- holt das Modul.git/config
Sie sich jetzt an und Sie finden ein registriertes Submodulquelle
Es scheint hier (auch) viel Verwirrung in den Antworten zu geben.
git submodule init
ist 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 clone
Projekt mit Submodulen (was Sie daran erkennen, dass der Klon eine .gitmodules-Datei ausgecheckt hat) durch agit submodule update --init --recursive
.Sie nicht folgen
git submodule add ...
mit einemgit submodule init
(odergit 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 pull
dieser Commits ausführen, ist das Verzeichnis dieses Submoduls vollständig leer (wenn Siegit submodule status
den Hash des neuen Submoduls ausführen, sollte der Hash sichtbar sein, aber ein-
vor it.) In diesem Fall müssen Sie Ihremgit pull
auch eingit submodule update --init
(plus,--recursive
wenn 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).quelle
git help submodule
dies ü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?--init
dies notwendig sein sollte, um neue Submodule zu bekommen (anstatt sie automatisch zu greifenupdate
)? Es scheint, als sollte die Aktualisierung Ihres Repositorys alles Notwendige abrufen, es sei denn, dies würde Daten zerstören. Damit müssen--init
Sie wissen, dass möglicherweise neue Submodule erstellt wurden, oder es wird immer--init
jedes Mal ein ausgegeben. In diesem Fall scheint es wieder so, als ob es standardmäßig aktiviert sein sollte.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 --recursive
nichts getan. Ich habe auch das Submodul-Verzeichnis entfernt und es ausgeführtgit submodules update --init --recursive
und 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
quelle
git submodule update
stattgit submodule update --remote
.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.
quelle
Zu denken, dass manuelles Einrichten
.gitmodules
ausreicht, ist FALSCHMein Einheimischer
git version 2.22.0
zum Zeitpunkt dieses Schreibens.Also kam ich zu diesem Thread und fragte mich, warum es nicht
git submodule init
funktionierte. Ich habe die.gitmodules
Datei eingerichtet und fortgefahrengit submodule init
...WICHTIG
git submodule add company/project.git includes/project
Dies ist erforderlich (beim erstmaligen Hinzufügen des Moduls)..git/config
.gitmodules
Dateiincludes/project
in diesem Beispiel).Sie müssen dann ,
git commit
nachdem Sie das Modul hinzugefügt haben, wird dies begehen.gitmodules
und die nachgeführte Submodul Lage.Wenn das Projekt erneut geklont wird, enthält es das
.gitmodules
Verzeichnis und das leere Submodulverzeichnis (z. B.includes/project
in diesem Beispiel). Zu diesem Zeitpunkt.git/config
gibt es noch keine Submodul-Konfiguration, bis sie ausgeführtgit submodule init
wird. Denken Sie daran, dass dies nur funktioniert, weil.gitmodules
ANDincludes/project
im Haupt-Git-Repo verfolgt wird.Auch als Referenz siehe:
quelle
Nach der Antwort von Dave James Miller kann ich bestätigen, dass es bei mir funktioniert hat. Das Wichtigste dabei war, die Festschreibungs-ID der Teilprojekte festzuschreiben. Nur den Eintrag in .gitmodules zu haben, war nicht genug.
Hier ist ein angemessenes Commit:
https://github.com/dirkaholic/vagrant-php-dev-box/commit/d5f4c40bdbd80eefbb5ac6029823733f591435ae
quelle
Ich hatte das gleiche Problem.
.gitmodules
hatte das Submodul, aber nach einemgit submodule init
Befehl war es nicht in.git/config
.Es stellte sich heraus, dass der Entwickler, der das Submodul hinzugefügt hat, der
.gitignore
Datei auch das Submodulverzeichnis hinzugefügt hat . Das geht nichtquelle
Genau wie Sie habe ich festgestellt, dass die Git-Submodul-Synchronisierung nicht das tut, was Sie erwarten. Erst nach
git submodule add
erneuter 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 vorgestelltgit submodule sync
hatte.quelle
Ich hatte heute das gleiche Problem und fand heraus, dass ich, weil ich damals tippte,
git submodule init
diese Zeile in meinem hatte.git/config
:Ich entfernte das und tippte:
Und alles war wieder normal, mein Submodul wurde wie gewohnt in seinem Unterverzeichnis aktualisiert.
quelle
Das Problem für mich ist, dass der vorherige Entwickler des Repos den
submodules/thing
Ordner als normalen Ordner festgeschrieben hat. Wenn ich also versuchte, ihn auszuführengit submodule add ...
, schlug er fehl mit: Der'submodules/thing' already exists in the index
Versuch, das Submodul zu aktualisieren, schlug ebenfalls fehl, da der Pfad dies nicht tat ein Submodul enthalten.Um dies zu beheben, musste ich den
submodules/thing
Ordner löschen , den Löschvorgang festschreiben und dann dengit submodule add
Befehl ausführen , um ihn wieder korrekt hinzuzufügen:quelle
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
.gitmodules
beide 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.quelle
Das Löschen des Submodulverzeichnisses und seines Inhalts (Ordner "external / pyfacebook"), falls es zuvor vorhanden war,
git submodule add ...
kann Probleme beheben.quelle
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 [email protected] destination
wurde die folgende Ausgabe angezeigt:Also habe ich versucht , den Befehl add zu erzwingen :
git submodule add --force [email protected] destination
Das hat in meinem Fall funktioniert.
quelle
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 [email protected] destination
quelle
.git/config
git submodule init
Befehl ausführengit pull origin master
Es sollte jetzt funktionieren
quelle
Teilen Sie einfach mit, was für mich funktioniert hat:
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.
quelle
Der folgende Synchronisierungsbefehl hat das Problem behoben:
quelle