Aucun mappage de sous-module trouvé dans .gitmodule pour un chemin qui n'est pas un sous-module

335

J'ai un projet qui a un sous-module à lib/three20

Mon .gitmodulefichier ressemble à ceci:

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

J'ai cloné cela dans le passé sans erreurs ( git submodule initsuivi d'un git submodule update) et cela fonctionne depuis un certain temps.

J'ai essayé de cloner cela sur une nouvelle machine, et maintenant je reçois cette erreur git submodule init:

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

Ce chemin n'est qu'un dossier vide dans Xcode que j'utilise pour héberger les projets de l'autre répertoire. Cela ne fait pas partie du .gitmodulesfichier, donc je ne vois pas d'où vient ce chemin.

Des idées?

Ben Scheirman
la source
1
Il semble que vous ayez réussi à ajouter ce chemin en tant que gitlink - un sous-module est une combinaison d'un gitlink et d'entrées dans les fichiers .gitmoddules et .git / config. Il y avait une question récente à ce sujet; essayer de le trouver ...
Cascabel
@Jefromi - Je ne trouve aucune mention de ce chemin dans le .gitdossier. Faire un grep -r "Classes/Support/Three20" *.*ne donne aucun résultat non plus
Ben Scheirman
2
@Ben: Pourquoi recherchez-vous ce texte dans le dossier .git? Ce n'est pas ainsi que git stocke le contenu. Si vous voulez vraiment vérifier ce que git pense que c'est, essayez git ls-tree HEAD Classes/Support, et s'il dit que Three20 est un commit, il y a un gitlink là. Si tel est le cas, suivez les instructions appropriées de la question VonC liée ci-dessus pour le transformer en un sous-module approprié ou le transformer en contenu régulièrement suivi.
Cascabel
2
pour les futurs visiteurs, si votre problème est lié à un sous-module supprimé et que heroku génère l'erreur, installez heroku-repo depuis github.com/heroku/heroku-repo et heroku repo: reset -a appname
fadomire

Réponses:

310

Suite à rajibchowdhury « de la réponse (upvoted), utilisergit rm la commande qui est conseillé est de suppression de la mention spéciale de l'indice indiquant un sous - module (a « dossier » avec un mode spécial 160000).

Si ce chemin d' entrée spécial n'est pas référencé dans le .gitmodule(comme ' Classes/Support/Three20' dans la question d'origine), vous devez le supprimer, afin d'éviter le message d'erreur " Aucun mappage de sous-module trouvé .gitmodulespour le chemin ".

Vous pouvez vérifier toutes les entrées de l'index qui font référence à des sous-modules:

git ls-files --stage | grep 160000

Réponse précédente (novembre 2010)

Il est possible que vous n'ayez pas déclaré correctement votre sous-module initial (c'est-à-dire sans queue '/' à la fin, comme décrit dans mon ancienne réponse , même si votre .gitmodulea des chemins qui semblent corrects).

Ce fil mentionne:

obtenez-vous la même erreur lors de l'exécution de «git submodule init» à partir d'un nouveau clone?
Si c'est le cas, vous avez quelque chose de mal.

Si vous n'avez pas de sous-modules, supprimez .gitmoduleset toutes les références aux sous-modules dans .git / config, et assurez-vous que le répertoire Pikimal ne contient pas de répertoire .git.
Si cela résout le problème, enregistrez-vous et faites de même sur votre copie de travail de croisière.

Évidemment, ne supprimez pas votre .gitmodulesfichier principal , mais prenez soin d'autres .gitmodulesfichiers supplémentaires dans votre arborescence de travail.


Toujours dans le sujet de "l'initialisation incorrecte des sous-modules", Jefromi mentionne des sous-modules qui sont en fait des gitlinks.

Voir Comment suivre le contenu non suivi? afin de convertir un tel répertoire en un vrai sous-module.

VonC
la source
5
Je n'ai pas de fichier .gitmodules et je reçois toujours ce message à chaque extraction / extraction. Que fais-je?
aaronbauman
2
Trouvé ma réponse ici: stackoverflow.com/questions/14720034/…
aaronbauman
4
@aaronbauman Oui, vous devez supprimer le gitlink, donc le git rm xxx(sans barre oblique) git rm --cachedvous permet de le conserver sur le disque tout en le supprimant de l'index.
VonC
Après avoir exécuté git ls-files --stage | grep 16000, j'ai trouvé quelques entrées. Comment puis-je les supprimer?
John Mike
1
@JohnMike si vous avez .gitmoduleréférençant ces entrées, alors stackoverflow.com/a/16162000/6309 . Sinon, un simple git rm afolder(pas de fuite / barre oblique)
VonC
412

Aucun mappage de sous-module trouvé dans .gitmodules pour le chemin 'OtherLibrary / MKStore' lorsque

$ git submodule update --init

Je ne savais pas pourquoi l'erreur s'est produite. Après avoir passé une minute et trouvé la réponse dans stackoverflow.

$ git rm --cached OtherLibrary/MKStore

puis mettez à jour le sous-module à nouveau. Ça marche bien.

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

rajibchowdhury
la source
2
cela a fonctionné pour moi après avoir édité le fichier .gitmodules pour changer https: // links par git: // links
Diwann
1
Cela a également fonctionné pour moi, mais je devais être sûr qu'il n'y avait pas de barre oblique à la fin du chemin du sous-module.
peter
Je ne peux pas croire que j'ai oublié l'option init. Si vous clonez un projet, vous devez démarrer les sous-modules avant de les mettre à jour.
alex
J'ai dû exécuter cela dans le répertoire racine du dépôt, puis tout a bien fonctionné. Merci!
Pwdr
Merci beaucoup pour la commande rm . J'ai appelé git submodule sync | grep "mapping found"alors git rmet encore git submodule sync. Problème disparu!.
nine9five
24

Lorsque j'utilise SourceTree pour faire les choses, il crachera ce message.
Le message que j'ai rencontré:

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

Mon scénario est que j'ai mal appliqué le répertoire du projet qui contient le dossier .git .
SourceTree considérait ce dossier comme un sous-module git, mais en fait pas.

Ma solution consiste à utiliser la ligne de commande pour le supprimer.

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

enlever les ordures dans git et les garder propres.

Johnny
la source
17

J'ai résolu ce problème pour moi. Au départ, j'ai essayé de faire ceci:

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

Il s'avère que la spécification de l'option --branch ne doit pas être utilisée si vous souhaitez cloner la branche principale . Il jette cette erreur:

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

Chaque fois que vous essayez de faire un

git submodule sync

Cette erreur sera levée:

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

Et les lignes nécessaires dans les modules .git ne sont jamais ajoutées.

La solution pour moi était donc la suivante:

git submodule add [URL] [PATH_TO_SUBMODULE]
luksak
la source
9

Je viens de frapper cette erreur après avoir essayé de "git submodule init" sur une nouvelle caisse de mon repo. Il s'avère que j'avais spécifié le sous-dossier du module avec le mauvais cas au départ. Comme je suis sur un Mac avec un système de fichiers sensible à la casse (hurr), il échouait. Par exemple:

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

réussit mais le problème est que sur le disque le chemin est

Myapp/Resources/Project

Ce que je ne comprends pas, c'est pourquoi git lance le module dans un mauvais dossier (en ignorant la casse incorrecte dans ma commande) mais fonctionne ensuite correctement (en échouant) avec les commandes suivantes.

James Moore
la source
Même chose ici (Windows), même si je ne comprends pas pourquoi. Vous devriez être libre de spécifier un dossier avec un boîtier différent pour la caisse et cela ne devrait pas changer le nom du module.
Xavier Poinas
6

Tout git rm subdir ira bien. qui supprimera le sous-répertoire en tant qu'index.

hit9
la source
5

Je viens d'avoir ce problème. Pendant un certain temps, j'ai essayé les conseils sur la suppression du chemin d'accès, git suppression du chemin d'accès, la suppression des .gitmodules, la suppression de l'entrée du .git / config, l'ajout du sous-module en arrière, puis la validation et la modification. C'était déroutant car cela ne ressemblait à aucun changement quand j'ai fait "git commit -a" alors j'ai essayé de pousser juste la suppression, puis de pousser la réédition pour que ça ressemble à un changement.

Après un certain temps, j'ai remarqué par accident qu'après avoir tout supprimé, si je lançais "git submodule update --init", il y avait un message sur un nom spécifique auquel git n'aurait plus dû faire référence: le nom du référentiel le sous-module était un lien vers, pas le nom du chemin vers lequel il était extrait. Grepping a révélé que cette référence était en .git / index. J'ai donc lancé "git rm --cached repo-name", puis réajouté le module. Lorsque j'ai validé cette fois, le message de validation incluait une modification indiquant qu'il supprimait cet objet inattendu. Après cela, ça fonctionne bien.

Je ne sais pas ce qui s'est passé, je suppose que quelqu'un a mal utilisé la commande git submodule, inversant peut-être les arguments. Ça aurait pu être moi même ... J'espère que ça aide quelqu'un!

anomolos
la source
5

dans le fichier .gitmodules , j'ai remplacé la chaîne

"path = thirdsrc\boost" 

avec

"path = thirdsrc/boost", 

et ça a résolu! - -

zhuzhai liu
la source
merci a résolu mon problème. probablement le problème qui se produit dans les fenêtres. Dans mon cas, le chemin était "chemin = quelque chose \\ dossier"
Roozbeh G
Cela a fonctionné pour moi lorsque j'ai rencontré une erreur lors de l'utilisation de git-lfs au lieu de git sur Windows. (Aucune erreur ne s'est produite lors de l'utilisation de git standard)
frage
5

Le mappage de dossier peut être trouvé dans le .git/modulesdossier (chacun a un configfichier en référence au sien worktree), assurez-vous donc que ces dossiers correspondent à la configuration dans .gitmoduleset .git/config.

A donc .gitmodulesle bon chemin:

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

et .git/modules/<path>/configdans la [core]section que vous avez le droit chemin à votre <path>, par exemple

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

Si le bon dossier .git/modulesest manquant, vous devez aller dans le répertoire de votre sous-module et essayer git reset HEAD --hardou git checkout master -f. Si cela ne vous aide pas, vous souhaiterez probablement supprimer toutes les références au sous-module cassé et l'ajouter à nouveau, puis voir: Renommer un sous-module git .

Kenorb
la source
3

Scénario: changer le sous-module du répertoire dirA-xxx en un autre répertoire dirB-xxx

  1. déplacer le dirA-xxx vers dirB-xxx
  2. modifier l'entrée dans .gitmodules pour utiliser dirB-xxx
  3. modifier l'entrée dans .git / config pour utiliser dirB-xxx
  4. modifier .git / modules / dirA-xxx / config pour refléter le bon répertoire
  5. modifier dirA-xxx / .git pour refléter le bon répertoire
  6. courir git submodule status

    si erreur de retour: aucun mappage de sous-module trouvé dans .gitmodules pour le chemin dirA-xxx. Cela est dû au fait que dirA-xxx n'existe pas, mais il est toujours suivi par git. Mettez à jour l'index git en:git rm --cached dirA-xxx

    Essayez avec git submodule foreach git pull. Je ne suis pas passé par l'étude réelle de la structure du sous-module git, donc les étapes ci-dessus peuvent casser quelque chose. Néanmoins, en passant par les étapes ci-dessus, les choses semblent bonnes pour le moment. Si vous avez des idées ou des étapes appropriées pour faire avancer les choses, partagez-les ici. :)

ken
la source
1

Habituellement, git crée un répertoire caché dans le répertoire racine du projet (.git /)

Lorsque vous travaillez sur un CMS, il est possible d'installer des modules / plugins portant le répertoire .git / avec les métadonnées de git pour le module / plugin spécifique

La solution la plus rapide consiste à trouver tous les répertoires .git et à ne conserver que votre répertoire de métadonnées root git. Si vous le faites, git ne considérera pas ces modules comme des sous-modules de projet.

yilmi
la source
1

Après avoir regardé mon .gitmodules, il s'est avéré que j'avais une lettre majuscule où je n'aurais pas dû. Gardez donc à l'esprit que les .gitmodulesrépertoires sont sensibles à la casse

Kelsey
la source
1
êtes-vous sûr que vous ne vouliez pas dire à la .gitmodulesplace?
Serhii Kheilyk
0

Dans mon cas, l'erreur était probablement due à une fusion incorrecte entre .gitmodules sur deux branches avec des configurations de sous-modules différentes. Après avoir pris les suggestions de ce forum, j'ai résolu le problème de modification manuelle du fichier .gitmodules, l'ajout de l'entrée de sous-module manquante est assez facile. Après cela, la commande git submodule update --init --recursive a fonctionné sans problème.

user2281802
la source
0

Le problème pour nous était que des entrées de sous-module en double avaient été ajoutées dans .gitmodules (probablement à partir d'une fusion). Nous avons recherché le chemin dont git se plaignait dans .gitmodules et avons trouvé les deux sections identiques. La suppression d'une des sections a résolu le problème pour nous.

Pour ce que ça vaut, git 1.7.1 a donné l'erreur "no submodule mapping" mais git 2.13.0 n'a pas semblé s'en soucier.

Walter Wilfinger
la source