No se encontró asignación de submódulo en .gitmodule para una ruta que no sea un submódulo

335

Tengo un proyecto que tiene un submódulo en lib/three20

Mi .gitmodulearchivo se ve así:

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

He clonado esto en el pasado sin errores ( git submodule initseguido de a git submodule update) y ha estado funcionando durante un tiempo.

Intenté clonar esto en una nueva máquina, y ahora recibo este error git submodule init:

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

Esa ruta es solo una carpeta vacía en Xcode que uso para alojar los proyectos del otro directorio. No es parte del .gitmodulesarchivo, así que no veo de dónde está obteniendo esta ruta.

¿Algunas ideas?

Ben Scheirman
fuente
1
Parece que pudo haber logrado agregar esa ruta como gitlink: un submódulo es una combinación de un gitlink y entradas en los archivos .gitmoddules y .git / config. Hubo una pregunta reciente sobre esto; tratando de encontrarlo ...
Cascabel
@Jefromi: no puedo encontrar ninguna mención de esa ruta en ninguna parte de la .gitcarpeta. Hacer un a grep -r "Classes/Support/Three20" *.*tampoco produce ningún resultado
Ben Scheirman
2
@Ben: ¿Por qué estás buscando ese texto en la carpeta .git? Así no es como git almacena contenido. Si realmente quieres verificar qué git cree que es, inténtalo git ls-tree HEAD Classes/Support, y si dice que Three20 es un commit, hay un gitlink allí. Si es así, siga las instrucciones apropiadas de la pregunta VonC vinculada anteriormente para convertirlo en un submódulo adecuado o convertirlo en contenido seguido regularmente.
Cascabel
2
para futuros visitantes, en caso de que su problema esté vinculado a un submódulo eliminado y heroku arrojando el error, instale heroku-repo desde github.com/heroku/heroku-repo y heroku repo: reset -a appname
fadomire

Respuestas:

310

Siguiendo rajibchowdhury 's respuesta (upvoted), el usogit rm de comandos que se aconseja es para quitar la entrada especial en el índice indica un submódulo (una 'carpeta' con un modo especial 160000).

Si esa ruta de entrada especial no está referenciada en .gitmodule(como ' Classes/Support/Three20' en la pregunta original), entonces debe eliminarla para evitar el mensaje de error " No se encontró asignación de submódulo en la .gitmodulesruta ".

Puede verificar todas las entradas en el índice que hacen referencia a submódulos:

git ls-files --stage | grep 160000

Respuesta anterior (noviembre de 2010)

Es posible que no haya declarado su submódulo inicial correctamente (es decir, sin ninguna cola '/' al final, como se describe en mi respuesta anterior , a pesar de que .gitmoduletiene rutas que se ven bien en él).

Este hilo menciona:

¿obtienes el mismo error al ejecutar 'git submodule init' desde un clon nuevo?
Si es así, tienes algo mal.

Si no tiene submódulos, elimine .gitmodulesy cualquier referencia a submódulos en .git / config, y asegúrese de que el directorio Pikimal no tenga un .gitdirectorio.
Si eso soluciona el problema, regístrese y haga lo mismo en su copia de trabajo de crucero.

Obviamente, no elimine su .gitmodulesarchivo principal , sino cuide otros .gitmodulesarchivos adicionales en su árbol de trabajo.


Aún en el tema de "inicialización incorrecta de submódulos", Jefromi menciona submódulos que en realidad son gitlinks.

Consulte ¿Cómo rastrear contenido no rastreado? para convertir dicho directorio en un submódulo real.

VonC
fuente
55
No tengo ningún archivo .gitmodules y sigo recibiendo este mensaje en cada pago / extracción. ¿Qué debo hacer?
aaronbauman
2
Encontré mi respuesta aquí: stackoverflow.com/questions/14720034/…
aaronbauman
44
@aaronbauman Sí, debe eliminar el gitlink, por lo tanto git rm xxx(sin barra inclinada) le git rm --cachedpermite mantenerlo en el disco mientras lo elimina del índice.
VonC
Después de ejecutar git ls-files --stage | grep 16000, he encontrado algunas entradas. ¿Cómo elimino estos?
John Mike
1
@JohnMike si tiene una .gitmodulereferencia a esas entradas, entonces stackoverflow.com/a/16162000/6309 . Si no, un simple git rm afolder(sin seguimiento / barra)
VonC
412

No se encontró asignación de submódulo en .gitmodules para la ruta 'OtherLibrary / MKStore' cuando

$ git submodule update --init

No sabía por qué ocurre el error. Después de pasar un minuto y encontrar la respuesta en stackoverflow.

$ git rm --cached OtherLibrary/MKStore

y luego actualice el submódulo nuevamente. Funciona bien

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

rajibchowdhury
fuente
2
funcionó para mí después de haber editado el archivo .gitmodules para cambiar https: // links by git: // links
Diwann
1
Esto también funcionó para mí, pero tenía que estar seguro de que no había una barra al final de la ruta del submódulo.
Peter
No puedo creer que olvidé la opción init. Si clona un proyecto, debe comenzar los submódulos antes de actualizarlos.
alex
Tuve que ejecutar esto en el directorio raíz del repositorio, luego todo funcionó bien. ¡Gracias!
Pwdr
Muchas gracias por el comando rm . Llamé git submodule sync | grep "mapping found"una git rmy otra vez git submodule sync. Problema desaparecido!
nine9five
24

Cuando uso SourceTree para hacer las cosas, escupirá este mensaje.
El mensaje que encontré:

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

Mi escenario es que apliqué mal el directorio del proyecto que contiene la carpeta .git .
SourceTree considera esta carpeta como submódulo git, pero en realidad no.

Mi solución es usar la línea de comando para eliminarlo.

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

retire la basura en git y manténgala limpia.

Johnny
fuente
17

Resolví este problema por mí. Inicialmente intenté hacer esto:

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

Resulta que la especificación de la opción --branch no debe usarse si desea clonar la rama maestra . Lanza este error:

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

Cada vez que intentas hacer un

git submodule sync

Este error será arrojado:

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

Y las líneas necesarias en .gitmodules nunca se agregan.

Entonces la solución para mí fue esta:

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

Acabo de recibir este error después de intentar "git submodule init" en un nuevo pago de mi repositorio. Resulta que inicialmente había especificado la subcarpeta del módulo con el caso incorrecto. Como estoy en una Mac con un sistema de archivos sensible a mayúsculas y minúsculas (hurr), estaba fallando. Por ejemplo:

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

tiene éxito pero el problema es que en el disco la ruta es

Myapp/Resources/Project

Lo que no entiendo es por qué git está iniciando el módulo en una carpeta incorrecta (ignorando el caso incorrecto en mi comando) pero luego funcionando correctamente (al fallar) con los comandos posteriores.

James Moore
fuente
Lo mismo aquí (Windows), aunque no entiendo por qué. Debe ser libre de especificar una carpeta con una carcasa diferente para el pago y esto no debería cambiar el nombre del módulo.
Xavier Poinas
6

Solo git rm subdir estará bien. eso eliminará el subdirectorio como índice.

hit9
fuente
5

Acabo de tener este problema. Durante un tiempo probé los consejos sobre cómo eliminar la ruta, git eliminar la ruta, eliminar .gitmodules, eliminar la entrada de .git / config, agregar el submódulo de nuevo, luego confirmar y empujar el cambio. Fue desconcertante porque no parecía haber ningún cambio cuando hice "git commit -a", así que intenté presionar solo la eliminación, luego presioné la readmisión para que pareciera un cambio.

Después de un tiempo, noté por accidente que después de eliminar todo, si ejecutaba "git submodule update --init", tenía un mensaje sobre un nombre específico al que git ya no debería haber tenido ninguna referencia: el nombre del repositorio del submódulo estaba vinculando, no el nombre de la ruta a la que lo estaba buscando. Grepping reveló que esta referencia estaba en .git / index. Entonces ejecuté "git rm --cached repo-name" y luego leí el módulo. Cuando me comprometí esta vez, el mensaje de confirmación incluía un cambio de que estaba eliminando este objeto inesperado. Después de eso, funciona bien.

No estoy seguro de lo que sucedió, supongo que alguien hizo un mal uso del comando git submodule, tal vez invirtiendo los argumentos. Podría haber sido yo incluso ... ¡Espero que esto ayude a alguien!

anomolos
fuente
5

en el archivo .gitmodules , reemplacé la cadena

"path = thirdsrc\boost" 

con

"path = thirdsrc/boost", 

y se solucionó! - -

zhuzhai liu
fuente
Gracias solucionó mi problema. probablemente el problema que ocurre en windows. En mi caso, la ruta era "ruta = algo \\ carpeta"
Roozbeh G
Esto funcionó para mí cuando recibí un error al usar git-lfs en lugar de git en Windows. (No se produjo ningún error al usar git estándar)
Frage
5

La asignación de carpetas se puede encontrar en la .git/modulescarpeta (cada una tiene un configarchivo con referencia a la suya worktree), así que asegúrese de que estas carpetas se correspondan con la configuración en .gitmodulesy .git/config.

Entonces .gitmodulestiene la ruta correcta:

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

y .git/modules/<path>/configen [core]la sección tienes el camino correcto para su <path>, por ejemplo,

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

Si .git/modulesfalta la carpeta correcta , debe ir al directorio de submódulos e intentar git reset HEAD --hardo git checkout master -f. Si esto no ayuda, probablemente desee eliminar todas las referencias al submódulo roto y agregarlo nuevamente, luego vea: Cambiar el nombre de un submódulo git .

kenorb
fuente
3

Escenario: cambiar el submódulo del directorio dirA-xxx a otro directorio dirB-xxx

  1. mover el dirA-xxx a dirB-xxx
  2. modificar la entrada en .gitmodules para usar dirB-xxx
  3. modificar la entrada en .git / config para usar dirB-xxx
  4. modificar .git / modules / dirA-xxx / config para reflejar el directorio correcto
  5. modificar dirA-xxx / .git para reflejar el directorio correcto
  6. correr git submodule status

    si devuelve el error: no se encontró asignación de submódulo en .gitmodules para la ruta dirA-xxx. Esto se debe a que dirA-xxx no existe, pero git todavía lo sigue. Actualice el índice git por:git rm --cached dirA-xxx

    Tratar con git submodule foreach git pull. No revisé el estudio real de la estructura del submódulo git, por lo que los pasos anteriores pueden romper algo. Sin embargo, siguiendo los pasos anteriores, las cosas se ven bien en este momento. Si tiene alguna idea o pasos adecuados para hacer algo, compártelo aquí. :)

conocido
fuente
1

Por lo general, git crea un directorio oculto en el directorio raíz del proyecto (.git /)

Cuando trabajas en un CMS, es posible que instales módulos / complementos que lleven el directorio .git / con los metadatos de git para el módulo / complemento específico

La solución más rápida es encontrar todos los directorios .git y mantener solo el directorio raíz de metadatos de git. Si lo hace, git no considerará esos módulos como submódulos del proyecto.

yilmi
fuente
1

Después de mirar mi .gitmodules, resultó que tenía una letra mayúscula donde no debería tenerla. Tenga en cuenta que los .gitmodulesdirectorios distinguen entre mayúsculas y minúsculas

Kelsey
fuente
1
¿estás seguro de que no quisiste decir en su .gitmoduleslugar?
Serhii Kheilyk
0

En mi caso, el error probablemente se debió a una fusión incorrecta entre .gitmodules en dos ramas con diferentes configuraciones de submódulos. Después de tomar sugerencias de este foro, resolví el problema editando manualmente el archivo .gitmodules, y agregar la entrada de submódulo faltante es bastante fácil. Después de eso, el comando git submodule update --init --recursive funcionó sin problemas.

usuario2281802
fuente
0

El problema para nosotros fue que las entradas duplicadas de submódulos se habían agregado a .gitmodules (probablemente de una fusión). Buscamos el camino del que se quejaba git en .gitmodules y encontramos las dos secciones idénticas. Eliminar una de las secciones nos resolvió el problema.

Por lo que vale, git 1.7.1 dio el error "sin mapeo de submódulos", pero a git 2.13.0 no pareció importarle.

Walter Wilfinger
fuente