Nessuna mappatura del sottomodulo trovata in .gitmodule per un percorso che non è un sottomodulo


335

Ho un progetto che ha un sottomodulo a lib/three20

Il mio .gitmodulefile è simile al seguente:

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

L'ho clonato in passato senza errori ( git submodule initseguito da una git submodule update) e ha funzionato per un po '.

Ho provato a clonarlo su una nuova macchina e ora visualizzo questo errore su git submodule init:

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

Quel percorso è solo una cartella vuota in Xcode che uso per ospitare i progetti dall'altra directory. Non fa parte del .gitmodulesfile, quindi non vedo da dove ottenga questo percorso.

Qualche idea?


1
Sembra che potresti essere riuscito ad aggiungere quel percorso come gitlink: un sottomodulo è una combinazione di un gitlink e voci nei file .gitmoddules e .git / config. C'è stata una domanda recente su questo; cercando di trovarlo ...
Cascabel,


@Jefromi - Non riesco a trovare menzione di quel percorso in nessun punto della .gitcartella. Anche fare un grep -r "Classes/Support/Three20" *.*non dà alcun risultato
Ben Scheirman,

2
@Ben: Perché stai cercando quel testo nella cartella .git? Non è così che Git archivia i contenuti. Se vuoi davvero verificare che cosa pensa git, prova git ls-tree HEAD Classes/Support, e se dice che Three20 è un commit, c'è un gitlink lì. In tal caso, seguire le istruzioni appropriate dalla domanda VonC collegata sopra per trasformarlo in un sottomodulo appropriato o trasformarlo in contenuto regolarmente monitorato.
Cascabel,

2
per i futuri visitatori, nel caso in cui il problema sia collegato a un sottomodulo rimosso e al suo lancio dell'errore, installare heroku-repo da github.com/heroku/heroku-repo e heroku repo: ripristinare -a nome
app

Risposte:


310

A seguito di rajibchowdhury 's risposta (upvoted), l'usogit rm dei comandi che è consigliato è per la rimozione della voce speciale nell'indice indica un modulo (una 'cartella' con una modalità speciale 160000).

Se quel percorso di entrata speciale non fa riferimento al .gitmodule(come ' Classes/Support/Three20' nella domanda originale), allora è necessario rimuoverlo, al fine di evitare il messaggio di errore " Nessun mapping del sottomodulo trovato .gitmodulesper il percorso ".

È possibile controllare tutte le voci nell'indice che fanno riferimento a sottomoduli:

git ls-files --stage | grep 160000

Risposta precedente (novembre 2010)

È possibile che tu non abbia dichiarato correttamente il tuo sottomodulo iniziale (cioè senza alcuna coda '/' alla fine, come descritto nella mia vecchia risposta , anche se hai dei .gitmodulepercorsi che sembrano a posto).

Questa discussione menziona:

ricevi lo stesso errore quando esegui 'git submodule init' da un nuovo clone?
Se è così, hai qualcosa di sbagliato.

Se non si hanno sottomoduli, eliminare .gitmodulese qualsiasi riferimento ai sottomoduli in .git / config e assicurarsi che la directory Pikimal non contenga una directory .git.
Se ciò risolve il problema, fai il check-in e fai lo stesso sulla tua copia funzionante in crociera.

Ovviamente, non cancellare il tuo .gitmodulesfile principale , ma prenditi cura di altri .gitmodulesfile extra nel tuo albero di lavoro.


Sempre nel tema dell'inizializzazione errata del sottomodulo, Jefromi menziona sottomoduli che in realtà sono gitlink.

Vedi Come monitorare i contenuti non monitorati? per convertire una tale directory in un vero sottomodulo.


5
Non ho alcun file .gitmodules e sto ancora ricevendo questo messaggio ad ogni checkout / pull. Cosa faccio?
aaronbauman,

2
Trovato la mia risposta qui: stackoverflow.com/questions/14720034/...
aaronbauman

4
@aaronbauman Sì, è necessario rimuovere gitlink, quindi il git rm xxx(senza barra finale) git rm --cachedconsente di tenerlo sul disco rimuovendolo dall'indice.
VonC

Dopo aver eseguito git ls-files --stage | grep 16000, ho trovato alcune voci. Come posso rimuoverli?
John Mike,

1
@JohnMike se hai un .gitmoduleriferimento a quelle voci, quindi stackoverflow.com/a/16162000/6309 . In caso contrario, un semplice git rm afolder(senza trascinamento / barra)
VonC

412

Nessun mapping sottomodulo trovato in .gitmodules per il percorso 'OtherLibrary / MKStore' quando

$ git submodule update --init

Non sapevo perché si verifica l'errore. Dopo aver trascorso un minuto e ho trovato la risposta in StackOverflow.

$ git rm --cached OtherLibrary/MKStore

e quindi aggiornare nuovamente il sottomodulo. Funziona bene.

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


2
ha funzionato per me dopo aver modificato il file .gitmodules per modificare https: // links di git: // links
Diwann

1
Questo ha funzionato anche per me, ma dovevo essere sicuro che non vi fosse alcun taglio alla fine del percorso del sottomodulo.
Pietro,

Non riesco a credere di aver dimenticato l'opzione init. Se si clona un progetto, è necessario avviare i sottomoduli prima di aggiornarli.
alex,

Ho dovuto eseguire questo nella directory principale del repository, quindi tutto ha funzionato bene. Grazie!
Pwdr,

Grazie mille per il comando rm . Ho chiamato git submodule sync | grep "mapping found"poi git rme di nuovo git submodule sync. Il problema è andato via !.
nine9five

24

Quando uso SourceTree per fare le cose, sputerà questo messaggio.
Il messaggio che ho riscontrato:

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

Il mio scenario è che ho applicato erroneamente la directory del progetto che contiene la cartella .git .
SourceTree ha considerato questa cartella come sottomodulo git, ma in realtà no.

La mia soluzione è utilizzare la riga di comando per rimuoverlo.

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

rimuovere la spazzatura in Git e tenerlo pulito.


17

Ho risolto questo problema per me. Inizialmente ho provato a fare questo:

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

Come risulta, la specifica dell'opzione --branch non dovrebbe essere usata se si desidera clonare il ramo master . Genera questo errore:

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

Ogni volta che provi a fare un

git submodule sync

Questo errore verrà generato:

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

E le linee necessarie in .gitmodules non vengono mai aggiunte.

Quindi la soluzione per me è stata questa:

git submodule add [URL] [PATH_TO_SUBMODULE]

9

Ho appena riscontrato questo errore dopo aver provato a "git submodule init" su un nuovo checkout del mio repository. Risulta che avevo inizialmente specificato la sottocartella del modulo con il caso sbagliato. Dato che sono su un Mac con un filesystem con distinzione tra maiuscole e minuscole (hurr), non ha funzionato. Per esempio:

git submodule add git@github.com:user/project.git MyApp/Resources/Project
Cloning into 'MyApp/Resources/Project'

ha esito positivo ma il problema è che il percorso è su disco

Myapp/Resources/Project

Quello che non capisco è perché git sta iniziando il modulo nella cartella sbagliata (ignorando il caso errato nel mio comando) ma poi funzionando correttamente (fallendo) con i comandi successivi.


Lo stesso qui (Windows), anche se non capisco perché. Dovresti essere libero di specificare una cartella con un involucro diverso per il checkout e questo non dovrebbe cambiare il nome del modulo.
Xavier Poinas,

6

Basta git rm subdir sarà ok. che rimuoverà il subdir come indice.


5

Ho appena avuto questo problema. Per un po 'ho provato il consiglio di rimuovere il percorso, git rimuovendo il percorso, rimuovendo .gitmodules, rimuovendo la voce da .git / config, aggiungendo nuovamente il sottomodulo, quindi eseguendo il commit e spingendo la modifica. Era sconcertante perché non sembrava esserci alcun cambiamento quando ho fatto "git commit -a", quindi ho provato a spingere solo la rimozione, quindi a spingere la readdition per farlo sembrare un cambiamento.

Dopo un po 'ho notato per caso che dopo aver rimosso tutto, se avessi eseguito "git submodule update --init", aveva un messaggio su un nome specifico a cui git non avrebbe dovuto più avere alcun riferimento: il nome del repository del sottomodulo si stava collegando, non il nome del percorso a cui lo stava verificando. Grepping ha rivelato che questo riferimento era in .git / index. Quindi ho eseguito "git rm --cache repo-name" e quindi ho ritoccato il modulo. Quando ho eseguito il commit questa volta, il messaggio di commit includeva una modifica che stava eliminando questo oggetto imprevisto. Dopodiché funziona benissimo.

Non sono sicuro di cosa sia successo, immagino che qualcuno abbia abusato del comando git submodule, forse invertendo gli argomenti. Potrei essere stato anche io ... Spero che questo aiuti qualcuno!


5

nel file .gitmodules , ho sostituito la stringa

"path = thirdsrc\boost" 

con

"path = thirdsrc/boost", 

e risolto! - -


grazie risolto il mio problema. probabilmente il problema che si verifica in Windows. Nel mio caso il percorso era "percorso = qualcosa \\ cartella"
Roozbeh G

Questo ha funzionato per me quando ho riscontrato un errore durante l'utilizzo di git-lfs invece di git su Windows. (Nessun errore si è verificato quando si utilizza git standard)
pagina

5

Il mapping delle cartelle si trova nella .git/modulescartella (ognuna ha un configfile con riferimento alla sua worktree), quindi assicurati che queste cartelle corrispondano alla configurazione in .gitmodulese .git/config.

Quindi .gitmodulesha il percorso corretto:

[submodule "<path>"]
  path = <path>
  url = git@github.com:foo/bar.git

e .git/modules/<path>/confignella [core]sezione hai la strada giusta per la vostra <path>, ad esempio,

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

Se .git/modulesmanca la cartella giusta in , allora devi andare alla directory del tuo sottomodulo e provare git reset HEAD --hardo git checkout master -f. Se questo non aiuta, probabilmente vuoi rimuovere tutti i riferimenti al sottomodulo rotto e aggiungerlo di nuovo, quindi vedi: Rinomina un sottomodulo git .


3

Scenario: modifica del sottomodulo dalla directory dirA-xxx in un'altra directory dirB-xxx

  1. sposta dirA-xxx in dirB-xxx
  2. modifica la voce in .gitmodules per usare dirB-xxx
  3. modifica la voce in .git / config per usare dirB-xxx
  4. modificare .git / modules / dirA-xxx / config per riflettere la directory corretta
  5. modificare dirA-xxx / .git per riflettere la directory corretta
  6. correre git submodule status

    in caso di errore di ritorno: nessuna mappatura del sottomodulo trovata in .gitmodules per il percorso dirA-xxx. Ciò è dovuto al fatto che dirA-xxx non esiste, ma è ancora tracciato da git. Aggiorna l'indice git di:git rm --cached dirA-xxx

    Prova con git submodule foreach git pull. Non ho approfondito lo studio della struttura del sottomodulo git, quindi i passaggi precedenti potrebbero rompere qualcosa. Tuttavia, passando attraverso i passaggi precedenti, le cose sembrano buone al momento. Se hai informazioni o passaggi adeguati per fare ciò, condividi qui. :)


1

Di solito, git crea una directory nascosta nella directory root del progetto (.git /)

Quando lavori su un CMS, è possibile che tu installi moduli / plugin che trasportano directory .git / con i metadati di git per il modulo / plugin specifico

La soluzione più rapida è trovare tutte le directory .git e mantenere solo la directory dei metadati di root git. Se lo fai, git non considererà quei moduli come sottomoduli di progetto.


1

Dopo aver visto la mia .gitmodules, ho scoperto che avevo una lettera maiuscola dove non avrei dovuto. Quindi tieni presente che le .gitmodulesdirectory fanno distinzione tra maiuscole e minuscole


1
sei sicuro di non voler dire .gitmodulesinvece?
Serhii Kheilyk,

0

Nel mio caso l'errore era probabilmente dovuto a una fusione errata tra .gitmodules su due rami con configurazioni di sottomoduli diverse. Dopo aver preso suggerimenti da questo forum, ho risolto il problema modificando manualmente il file .gitmodules, aggiungendo la voce mancante del sottomodulo è abbastanza semplice. Successivamente, il comando git submodule update --init --recursive ha funzionato senza problemi.


0

Il problema per noi era che voci duplicate del sottomodulo erano state aggiunte in .gitmodules (probabilmente da una fusione). Abbiamo cercato il percorso di cui ci si lamentava in .gitmodules e abbiamo trovato le due sezioni identiche. L'eliminazione di una delle sezioni ha risolto il problema per noi.

Per quello che vale, git 1.7.1 ha dato l'errore "no sottomodule mapping" ma a git 2.13.0 non sembra importare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.