In .gitmodule wurde keine Submodulzuordnung für einen Pfad gefunden, der kein Submodul ist

335

Ich habe ein Projekt, das ein Submodul bei hat lib/three20

Meine .gitmoduleDatei sieht folgendermaßen aus:

[submodule "lib/three20"]
    path = lib/three20
    url = git://github.com/facebook/three20.git

Ich habe dies in der Vergangenheit fehlerfrei geklont ( git submodule initgefolgt von a git submodule update) und es funktioniert schon eine Weile.

Ich habe versucht, dies auf einen neuen Computer zu klonen, und jetzt erhalte ich den folgenden Fehler git submodule init:

No submodule mapping found in .gitmodules for path 'Classes/Support/Three20'

Dieser Pfad ist nur ein leerer Ordner in Xcode, in dem ich die Projekte aus dem anderen Verzeichnis unterbringe. Es ist nicht Teil der .gitmodulesDatei, daher sehe ich nicht, woher dieser Pfad stammt.

Irgendwelche Ideen?

Ben Scheirman
quelle
1
Es hört sich so an, als hätten Sie es vielleicht geschafft, diesen Pfad als Gitlink hinzuzufügen - ein Submodul ist eine Kombination aus einem Gitlink und Einträgen in den Dateien .gitmoddules und .git / config. Es gab kürzlich eine Frage dazu; versuchen es zu finden ...
Cascabel
@Jefromi - Ich kann diesen Pfad nirgendwo im .gitOrdner erwähnen . Ein zu tun grep -r "Classes/Support/Three20" *.*bringt auch keine Ergebnisse
Ben Scheirman
2
@ Ben: Warum suchst du nach diesem Text im Ordner .git ? So speichert Git keine Inhalte. Wenn Sie wirklich überprüfen möchten, was Git für richtig hält, versuchen Sie es git ls-tree HEAD Classes/Support, und wenn dort steht, dass Three20 ein Commit ist, gibt es dort einen Gitlink. Wenn dies der Fall ist, befolgen Sie die entsprechenden Anweisungen aus der oben verlinkten Frage VonC, um sie entweder in ein geeignetes Submodul oder in regelmäßig nachverfolgten Inhalt umzuwandeln.
Cascabel
2
Für zukünftige Besucher, falls Ihr Problem mit einem entfernten Submodul und Heroku verbunden ist, das den Fehler auslöst, installieren Sie Heroku-Repo von github.com/heroku/heroku-repo und Heroku Repo: Reset -a Appname
Fadomire

Antworten:

309

Nach rajibchowdhury ‚s Antwort (upvoted), Verwendunggit rm der Befehl wird empfohlen, ist für das Entfernen von speziellen Eintrag im Index ein Submodul angibt (a‚Ordner‘mit einem speziellen Modus 160000).

Wenn der spezielle Eingabepfad nicht in der verwiesen wird .gitmodule(wie ‚ Classes/Support/Three20‘ in der ursprünglichen Frage), dann müssen Sie es entfernen, um das zu vermeiden " Keine Submodul Zuordnung gefunden .gitmodulesfür Pfadfehlermeldung".

Sie können alle Einträge im Index überprüfen, die auf Submodule verweisen:

git ls-files --stage | grep 160000

Vorherige Antwort (November 2010)

Es ist möglich, dass Sie Ihr ursprüngliches Submodul nicht korrekt deklariert haben (dh ohne Ende '/' am Ende, wie in meiner alten Antwort beschrieben , obwohl Ihr .gitmodulePfad in Ordnung ist).

Dieser Thread erwähnt:

Erhalten Sie den gleichen Fehler, wenn Sie 'git submodule init' von einem neuen Klon ausführen?
Wenn ja, stimmt etwas nicht.

Wenn Sie keine Submodule haben, löschen Sie .gitmodulesalle Verweise auf Submodule in .git / config und stellen Sie sicher, dass das Pikimal-Verzeichnis kein Verzeichnis enthält .git.
Wenn das Problem dadurch behoben wird, checken Sie ein und machen Sie dasselbe auf Ihrer Kreuzfahrt-Arbeitskopie.

Löschen Sie natürlich nicht Ihre Hauptdatei .gitmodules, sondern kümmern Sie sich um andere zusätzliche .gitmodulesDateien in Ihrem Arbeitsbaum.


Jefromi erwähnt immer noch im Thema "falsche Submodulinitialisierung" Submodule, die tatsächlich Gitlinks sind.

Siehe So verfolgen Sie nicht verfolgte Inhalte um ein solches Verzeichnis in ein echtes Submodul umzuwandeln.

VonC
quelle
5
Ich habe keine .gitmodules-Datei und erhalte diese Meldung immer noch bei jedem Checkout / Pull. Was mache ich?
Aaronbauman
2
Ich habe meine Antwort hier gefunden: stackoverflow.com/questions/14720034/…
aaronbauman
4
@aaronbauman Ja, Sie müssen den Gitlink entfernen, daher können Sie ihn mit dem git rm xxx(ohne nachgestellten Schrägstrich) git rm --cachedauf der Festplatte behalten, während Sie ihn aus dem Index entfernen.
VonC
Nach dem Ausführen von git ls-files --stage | grep 16000, ich habe einige Einträge gefunden. Wie entferne ich diese?
John Mike
1
@ JohnMike Wenn Sie einen .gitmoduleVerweis auf diese Einträge haben, dann stackoverflow.com/a/16162000/6309 . Wenn nicht, ein einfacher git rm afolder(kein Nachlauf / Schrägstrich)
VonC
412

In .gitmodules wurde keine Submodulzuordnung für den Pfad 'OtherLibrary / MKStore' gefunden, wenn

$ git submodule update --init

Ich wusste nicht, warum der Fehler auftritt. Nach einer Minute und fand die Antwort im Stackoverflow.

$ git rm --cached OtherLibrary/MKStore

und aktualisieren Sie das Submodul erneut. Es funktioniert gut.

http://en.saturngod.net/no-submodule-mapping-found-in-gitmodules

Rajibchowdhury
quelle
2
es funktionierte für mich, nachdem ich die .gitmodules-Datei bearbeitet hatte, um https: // links von git: // links zu ändern
Diwann
1
Dies funktionierte auch für mich, aber ich musste sicher sein, dass es am Ende des Submodulpfads keinen Schrägstrich gab.
Peter
Ich kann nicht glauben, dass ich die Init-Option vergessen habe. Wenn Sie ein Projekt klonen, sollten Sie vorher Submodule starten, um sie zu aktualisieren.
alex
Musste dies im Stammverzeichnis des Repos ausführen, dann hat alles gut funktioniert. Vielen Dank!
Pwdr
Vielen Dank für den Befehl rm . Ich rief git submodule sync | grep "mapping found"dann git rmwieder git submodule sync. Problem weg!
Nine9five
24

Wenn ich SourceTree benutze, um das Zeug zu machen, wird es diese Nachricht ausspucken.
Die Nachricht, auf die ich gestoßen bin:

git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree submodule update --init --recursive
No submodule mapping found in .gitmodules for path 'SampleProject/SampleProject'
Completed with errors, see above

Mein Szenario ist, dass ich das Projektverzeichnis, das den Ordner .git enthält, falsch angewendet habe .
SourceTree betrachtete diesen Ordner als Git-Submodul, aber eigentlich nicht.

Meine Lösung ist die Verwendung der Befehlszeile, um es zu entfernen.

$ git rm -r SampleProject --cached
$ git commit -m "clean up folders"

Entferne den Müll in Git und halte ihn sauber.

Johnny
quelle
17

Ich habe dieses Problem für mich gelöst. Anfangs habe ich versucht, dies zu tun:

git submodule add --branch master [URL] [PATH_TO_SUBMODULE]

Wie sich herausstellt, sollte die Spezifikation der Option --branch nicht verwendet werden, wenn Sie den Hauptzweig klonen möchten . Es wirft diesen Fehler aus:

fatal: Cannot force update the current branch.
Unable to checkout submodule '[PATH_TO_SUBMODULE]'

Jedes Mal, wenn Sie versuchen, eine

git submodule sync

Dieser Fehler wird ausgelöst:

No submodule mapping found in .gitmodules for path '[PATH_TO_SUBMODULE]'

Und die in .gitmodules benötigten Zeilen werden niemals hinzugefügt.

Die Lösung für mich war also:

git submodule add [URL] [PATH_TO_SUBMODULE]
luksak
quelle
9

Ich habe gerade diesen Fehler festgestellt, nachdem ich versucht habe, "submodule init" an einer neuen Kasse meines Repos zu "git". Es stellte sich heraus, dass ich den Modul-Unterordner anfangs mit dem falschen Fall angegeben hatte. Da ich auf einem Mac mit einem Dateisystem mit Groß- und Kleinschreibung (Hurr) bin, ist dies fehlgeschlagen. Zum Beispiel:

git submodule add [email protected]:user/project.git MyApp/Resources/Project
Cloning into 'MyApp/Resources/Project'

erfolgreich, aber das Problem ist, dass auf der Festplatte der Pfad ist

Myapp/Resources/Project

Was ich nicht verstehe, ist, warum git das Modul in einen falschen Ordner initiiert (wobei der falsche Fall in meinem Befehl ignoriert wird), aber dann mit nachfolgenden Befehlen korrekt funktioniert (indem es fehlschlägt).

James Moore
quelle
Gleiches hier (Windows), obwohl ich nicht verstehe warum. Es sollte Ihnen freigestellt sein, einen Ordner mit einem anderen Gehäuse für die Kaufabwicklung anzugeben, und dies sollte den Modulnamen nicht ändern.
Xavier Poinas
6

Nur git rm subdir wird in Ordnung sein. Dadurch wird das Unterverzeichnis als Index entfernt.

hit9
quelle
5

Hatte gerade dieses Problem. Für eine Weile habe ich versucht, den Pfad zu entfernen, den Pfad zu entfernen, Git-Module zu entfernen, den Eintrag aus Git / Config zu entfernen, das Submodul wieder hinzuzufügen, dann die Änderung festzuschreiben und zu verschieben. Es war rätselhaft, weil es nach keiner Änderung aussah, als ich "git commit -a" machte, also habe ich versucht, nur das Entfernen und dann die Neuausgabe zu drücken, damit es wie eine Änderung aussieht.

Nach einer Weile bemerkte ich zufällig, dass nach dem Entfernen von "git submodule update --init" eine Meldung über einen bestimmten Namen angezeigt wurde, auf den git keinen Verweis mehr haben sollte: den Namen des Repositorys des Submoduls wurde verlinkt, nicht der Pfadname, auf den es ausgecheckt hat. Grepping ergab, dass sich diese Referenz in .git / index befand. Also habe ich "git rm --cached repo-name" ausgeführt und dann das Modul erneut gelesen. Als ich dieses Mal festschrieb, enthielt die Festschreibungsnachricht eine Änderung, dass dieses unerwartete Objekt gelöscht wurde. Danach funktioniert es gut.

Ich bin mir nicht sicher, was passiert ist. Ich vermute, jemand hat den Befehl git submodule missbraucht und möglicherweise die Argumente umgekehrt. Könnte ich sogar gewesen sein ... Hoffe das hilft jemandem!

Anomolos
quelle
5

In der Datei .gitmodules habe ich den String ersetzt

"path = thirdsrc\boost" 

mit

"path = thirdsrc/boost", 

und es gelöst! - -

zhuzhai liu
quelle
danke behoben mein problem. wahrscheinlich das Problem, das in Windows auftritt. In meinem Fall war Pfad "Pfad = etwas \\ Ordner"
Roozbeh G
Dies funktionierte für mich, als ich bei der Verwendung von git-lfs anstelle von git unter Windows auf einen Fehler stieß. (Bei Verwendung von Standard-Git ist kein Fehler aufgetreten.)
Frage
5

Die Ordnerzuordnung befindet sich im .git/modulesOrdner (jeder hat eine configDatei mit Bezug auf seine worktree). Stellen Sie daher sicher, dass diese Ordner der Konfiguration in .gitmodulesund entsprechen .git/config.

Hat .gitmodulesalso den richtigen Weg:

[submodule "<path>"]
  path = <path>
  url = [email protected]:foo/bar.git

und in .git/modules/<path>/configin [core]Abschnitt haben Sie den richtigen Pfad zu Ihrem <path>, zB

[core]
  repositoryformatversion = 0
  filemode = true
  bare = false
  logallrefupdates = true
  worktree = ../../../<path>

Wenn der richtige Ordner .git/modulesfehlt, müssen Sie zu Ihrem Submodul-Verzeichnis gehen und versuchen, git reset HEAD --hardoder git checkout master -f. Wenn dies nicht hilft, möchten Sie wahrscheinlich alle Verweise auf das defekte Submodul entfernen und erneut hinzufügen. Weitere Informationen finden Sie unter: Umbenennen eines Git-Submoduls .

Kenorb
quelle
3

Szenario: Ändern des Submoduls vom Verzeichnis dirA-xxx in ein anderes Verzeichnis dirB-xxx

  1. Verschieben Sie das dirA-xxx nach dirB-xxx
  2. Ändern Sie den Eintrag in .gitmodules, um dirB-xxx zu verwenden
  3. Ändern Sie den Eintrag in .git / config, um dirB-xxx zu verwenden
  4. Ändern Sie .git / modules / dirA-xxx / config, um das richtige Verzeichnis wiederzugeben
  5. Ändern Sie dirA-xxx / .git, um das richtige Verzeichnis wiederzugeben
  6. Lauf git submodule status

    Wenn Rückgabefehler: In .gitmodules für den Pfad dirA-xxx wurde keine Submodulzuordnung gefunden. Dies liegt daran, dass dirA-xxx nicht vorhanden ist, aber dennoch von git verfolgt wird. Aktualisieren Sie den Git-Index durch:git rm --cached dirA-xxx

    Versuchen Sie es mit git submodule foreach git pull. Ich habe die eigentliche Untersuchung der Struktur des Git-Submoduls nicht durchlaufen, daher können die obigen Schritte etwas beschädigen. Trotzdem sieht es im Moment gut aus. Wenn Sie einen Einblick oder geeignete Schritte haben, um etwas zu erledigen, teilen Sie ihn hier mit. :) :)

Ken
quelle
1

Normalerweise erstellt git ein verstecktes Verzeichnis im Stammverzeichnis des Projekts (.git /).

Wenn Sie an einem CMS arbeiten, können Sie möglicherweise Module / Plugins installieren, die das Verzeichnis .git / mit den Metadaten von git für das jeweilige Modul / Plugin enthalten

Die schnellste Lösung besteht darin, alle .git-Verzeichnisse zu finden und nur Ihr Root-Git-Metadatenverzeichnis zu behalten. Wenn Sie dies tun, betrachtet git diese Module nicht als Projekt-Submodule.

Yilmi
quelle
1

Nachdem ich mir meine angesehen hatte .gitmodules, stellte sich heraus, dass ich einen Großbuchstaben hatte, den ich nicht haben sollte. Beachten Sie also, dass bei den .gitmodulesVerzeichnissen zwischen Groß- und Kleinschreibung unterschieden wird

Kelsey
quelle
1
Bist du sicher, dass du nicht .gitmodulesstattdessen gemeint hast ?
Serhii Kheilyk
0

In meinem Fall war der Fehler wahrscheinlich auf eine falsche Zusammenführung von .gitmodules auf zwei Zweigen mit unterschiedlichen Submodulkonfigurationen zurückzuführen. Nachdem ich Vorschläge aus diesem Forum angenommen hatte, löste ich das Problem beim manuellen Bearbeiten der .gitmodules-Datei. Das Hinzufügen des fehlenden Submoduleintrags ist ziemlich einfach. Danach funktionierte der Befehl git submodule update --init --recursive ohne Probleme.

user2281802
quelle
0

Das Problem für uns war, dass doppelte Submoduleinträge zu .gitmodules hinzugefügt wurden (wahrscheinlich aus einer Zusammenführung). Wir haben nach dem Pfad gesucht, über den sich git in .gitmodules beschwert hat, und die beiden identischen Abschnitte gefunden. Das Löschen eines der Abschnitte löste das Problem für uns.

Für das, was es wert ist, gab Git 1.7.1 den Fehler "Keine Submodulzuordnung", aber Git 2.13.0 schien sich nicht darum zu kümmern.

Walter Wilfinger
quelle