Nenhum mapeamento de submódulo encontrado no .gitmodule para um caminho que não é um submódulo

335

Eu tenho um projeto que tem um submódulo em lib/three20

Meu .gitmodulearquivo fica assim:

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

Eu clonei isso no passado sem erros ( git submodule initseguido de a git submodule update) e ele está funcionando há um tempo.

Tentei clonar isso em uma nova máquina e agora estou recebendo este erro git submodule init:

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

Esse caminho é apenas uma pasta vazia no Xcode que eu uso para abrigar os projetos do outro diretório. Como não faz parte do .gitmodulesarquivo, não vejo de onde está vindo esse caminho.

Alguma ideia?

Ben Scheirman
fonte
11
Parece que você conseguiu adicionar esse caminho como um gitlink - um submódulo é uma combinação de um gitlink e entradas nos arquivos .gitmoddules e .git / config. Houve uma pergunta recente sobre isso; tentando encontrá-lo ...
Cascabel
10
@Jefromi: stackoverflow.com/questions/4161022/… ?
VonC 15/11/2010
@ Jeffromi - Não encontro menção desse caminho em nenhum lugar da .gitpasta. Fazer a grep -r "Classes/Support/Three20" *.*também não produz resultados
Ben Scheirman
2
@ Ben: Por que você está procurando esse texto na pasta .git? Não é assim que o git armazena conteúdo. Se você realmente deseja verificar o que o git pensa que é, tente git ls-tree HEAD Classes/Support, e se diz Three20 é um commit, existe um gitlink lá. Se houver, siga as instruções apropriadas da pergunta VonC vinculada acima para transformá-lo em um submódulo adequado ou em conteúdo rastreado regularmente.
Cascabel
2
para os futuros visitantes, no caso o problema está ligado a um sub-módulo removido e heroku jogando o erro, instale heroku-repo de github.com/heroku/heroku-repo e heroku repo: redefinição -a appname
fadomire

Respostas:

309

Após rajibchowdhury 's resposta (upvoted), usogit rm de comando que é recomendado é para remover a entrada especial no índice indicando um sub-módulo (a 'pasta' com um modo especial 160000).

Se esse caminho de entrada especial não for referenciado na .gitmodule(como ' Classes/Support/Three20' na pergunta original), será necessário removê-lo para evitar a mensagem de erro " Nenhum mapeamento de sub-módulo encontrado no .gitmodulescaminho ".

Você pode verificar todas as entradas no índice que estão referenciando submódulos:

git ls-files --stage | grep 160000

Resposta anterior (novembro de 2010)

É possível que você não tenha declarado seu submódulo inicial corretamente (ou seja, sem nenhuma cauda '/' no final, conforme descrito na minha resposta antiga , mesmo que você .gitmodulepossua caminhos que pareçam bem).

Este tópico menciona:

você recebe o mesmo erro ao executar o 'git submodule init' de um novo clone?
Se sim, você tem algo errado.

Se você não possui submódulos, exclua .gitmodulese faça referências a submódulos em .git / config e verifique se o diretório Pikimal não possui um .gitdiretório.
Se isso resolver o problema, faça o check-in e faça o mesmo na sua cópia de trabalho do cruzeiro.

Obviamente, não exclua seu .gitmodulesarquivo principal , mas cuide de outros .gitmodulesarquivos extras em sua árvore de trabalho.


Ainda no tópico "inicialização incorreta do sub-módulo", o Jefromi menciona sub-módulos que na verdade são gitlinks.

Consulte Como rastrear conteúdo não rastreado? para converter esse diretório em um submódulo real.

VonC
fonte
5
Não tenho nenhum arquivo .gitmodules e ainda recebo essa mensagem em cada checkout / pull. O que eu faço?
aaronbauman
2
Encontrei minha resposta aqui: stackoverflow.com/questions/14720034/…
aaronbauman
4
@aaronbauman Sim, você precisa remover o gitlink, portanto o git rm xxx(sem barra) git rm --cachedpermite mantê-lo em disco enquanto o remove do índice.
VonC 17/03/19
Após executar o git ls-files --stage | grep 16000, encontrei algumas entradas. Como eu os removo?
John Mike
11
@JohnMike, se você tiver uma .gitmodulereferência a essas entradas, stackoverflow.com/a/16162000/6309 . Se não, um simples git rm afolder(sem fuga / barra)
VonC
412

Nenhum mapeamento de submódulo encontrado em .gitmodules para o caminho 'OtherLibrary / MKStore' quando

$ git submodule update --init

Não sabia por que o erro ocorreu. Depois de gastar um minuto e encontrou a resposta no stackoverflow.

$ git rm --cached OtherLibrary/MKStore

e atualize o submódulo novamente. Está funcionando bem.

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

rajibchowdhury
fonte
2
funcionou para mim depois de ter editado o arquivo .gitmodules para alterar https: // links por git: // links
Diwann
11
Isso funcionou para mim também, mas eu tinha que ter certeza de que não havia nenhuma barra no final do caminho do submódulo.
peter
Não acredito que esqueci a opção init. Se você clonar um projeto, inicie os submódulos antes para atualizá-los.
20915 alex
Teve que executar isso no diretório raiz do repositório, então tudo funcionou bem. Obrigado!
Pwdr # 20/15
Muito obrigado pelo comando rm . Liguei git submodule sync | grep "mapping found"então git rme novamente git submodule sync. Problema desapareceu!
nine9five
24

Quando eu uso o SourceTree para fazer as coisas, ele cospe essa mensagem.
A mensagem que encontrei:

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

Meu cenário é que eu apliquei incorretamente o diretório do projeto na pasta contém .git .
O SourceTree considerou essa pasta como submodule git, mas na verdade não.

Minha solução é usar a linha de comando para removê-lo.

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

remova o lixo no git e mantenha-o limpo.

Johnny
fonte
17

Eu resolvi esse problema para mim. Inicialmente, tentei fazer isso:

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

Como se vê, a especificação da opção --branch não deve ser usada se você deseja clonar a ramificação principal . Lança este erro:

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

Toda vez que você tenta fazer uma

git submodule sync

Este erro será lançado:

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

E as linhas necessárias nos módulos .git nunca são adicionadas.

Então a solução para mim foi esta:

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

Acabei de acertar este erro depois de tentar "git submodule init" em um novo checkout do meu repo. Acontece que eu havia especificado a subpasta do módulo com o caso errado inicialmente. Como estou em um Mac com um sistema de arquivos que diferencia maiúsculas de minúsculas (hurr), ele estava falhando. Por exemplo:

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

mas o problema é que, no disco, o caminho é

Myapp/Resources/Project

O que não entendo é por que o git está iniciando o módulo na pasta errada (ignorando o caso incorreto no meu comando), mas depois operando corretamente (com falha) com os comandos subseqüentes.

James Moore
fonte
O mesmo aqui (Windows), embora eu não entenda o porquê. Você deve poder escolher uma pasta com caixa diferente para o checkout e isso não deve alterar o nome do módulo.
Xavier Poinas 6/15
6

git rm subdir vai ficar bem. isso removerá o subdir como um índice.

hit9
fonte
5

Só tive esse problema. Por um tempo, tentei o conselho sobre como remover o caminho, git, remover o caminho, remover .gitmodules, remover a entrada de .git / config, adicionar o submódulo de volta, confirmar e pressionar a alteração. Era intrigante, porque não parecia haver alteração quando eu "git commit -a", então tentei pressionar apenas a remoção e pressionar a leitura para torná-la uma alteração.

Depois de um tempo, notei acidentalmente que, depois de remover tudo, se eu executasse "atualização do sub-módulo git --init", havia uma mensagem sobre um nome específico ao qual o git não deveria mais ter referência: o nome do repositório do submódulo estava vinculando, não o nome do caminho para o qual estava fazendo check-out. O Grepping revelou que essa referência estava em .git / index. Então, executei "git rm --cached repo-name" e depois li o módulo. Quando confirmei esse momento, a mensagem de confirmação incluía uma alteração que estava excluindo esse objeto inesperado. Depois disso, funciona bem.

Não tenho certeza do que aconteceu, acho que alguém usou mal o comando subitule git, talvez revertendo os argumentos. Poderia ter sido eu até ... Espero que isso ajude alguém!

anomolos
fonte
5

no arquivo .gitmodules , substitui string

"path = thirdsrc\boost" 

com

"path = thirdsrc/boost", 

e resolveu! - -

zhuzhai liu
fonte
obrigado resolveu o meu problema. provavelmente o problema que ocorre no Windows. No meu caso caminho era "path = \\ pasta alguma coisa"
Roozbeh G
Isso funcionou para mim quando eu acertei um erro ao usar o git-lfs em vez do git no Windows. (Nenhum erro ocorreu ao usar o git padrão)
frage 14/11
5

O mapeamento de pastas pode ser encontrado na .git/modulespasta (cada um possui um configarquivo com referência ao seu worktree), portanto, verifique se essas pastas correspondem à configuração em .gitmodulese .git/config.

Então, .gitmodulestem o caminho correto:

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

e .git/modules/<path>/configna [core]seção você tem o caminho certo para o seu <path>, por exemplo,

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

Se a pasta correta .git/modulesestiver faltando, você deverá acessar o diretório do submódulo e tentar git reset HEAD --hardou git checkout master -f. Se isso não ajudar, você provavelmente deseja remover todas as referências ao submódulo quebrado e adicioná-lo novamente, e consulte: Renomear um submódulo git .

kenorb
fonte
3

Cenário: alterando o submódulo do diretório dirA-xxx para outro diretório dirB-xxx

  1. mova o dirA-xxx para dirB-xxx
  2. modificar entrada em .gitmodules para usar dirB-xxx
  3. modificar entrada no .git / config para usar dirB-xxx
  4. modifique .git / modules / dirA-xxx / config para refletir o diretório correto
  5. modifique dirA-xxx / .git para refletir o diretório correto
  6. corre git submodule status

    if return error: Nenhum mapeamento de submodule foi encontrado em .gitmodules para o caminho dirA-xxx. Isso ocorre porque o dirA-xxx não existe, mas ainda é rastreado pelo git. Atualize o índice git:git rm --cached dirA-xxx

    Tente com git submodule foreach git pull. Eu não passei pelo estudo real da estrutura do sub-módulo git, portanto, as etapas acima podem quebrar alguma coisa. No entanto, seguindo as etapas acima, as coisas parecem boas no momento. Se você tiver alguma ideia ou etapas apropriadas para fazer as coisas, compartilhe aqui. :)

ken
fonte
1

Normalmente, o git cria um diretório oculto no diretório raiz do projeto (.git /)

Quando você está trabalhando em um CMS, é possível instalar módulos / plugins com o diretório .git / com os metadados do git para o módulo / plugin específico

A solução mais rápida é encontrar todos os diretórios .git e manter apenas o diretório raiz de metadados do git. Se você fizer isso, o git não considerará esses módulos como sub-módulos do projeto.

yilmi
fonte
1

Depois de olhar para o meu .gitmodules, descobriu-se que eu tinha uma letra maiúscula onde não deveria. Portanto, lembre-se de que os .gitmodulesdiretórios diferenciam maiúsculas de minúsculas

Kelsey
fonte
11
Tem certeza de que não quis dizer isso .gitmodules?
Serhii Kheilyk
0

No meu caso, o erro provavelmente ocorreu devido a uma mesclagem incorreta entre .gitmodules em duas ramificações com configurações diferentes de sub-módulos. Depois de receber sugestões deste fórum, resolvi o problema de edição manual do arquivo .gitmodules, adicionar a entrada do submodulo ausente é bastante fácil. Depois disso, o comando update do sub-módulo git --init --recursive funcionou sem problemas.

user2281802
fonte
0

O problema para nós era que entradas duplicadas de submodule foram adicionadas a .gitmodules (provavelmente de uma mesclagem). Pesquisamos o caminho que o git reclamava nos módulos .git e encontramos as duas seções idênticas. A exclusão de uma das seções resolveu o problema para nós.

Pelo que vale, o git 1.7.1 deu o erro "no submodule mapping", mas o git 2.13.0 não pareceu se importar.

Walter Wilfinger
fonte