Aquí está parte del contenido de mi .gitmodulesarchivo:
[submodule "src/static_management"]
path = src/static_management
url = git://github.com/eykd/django-static-management.git
[submodule "external/pyfacebook"]
path = external/pyfacebook
url = http://github.com/sciyoshi/pyfacebook.git
Sin embargo, .git/configsolo contiene el primero:
[submodule "src/static_management"]
url = git://github.com/eykd/django-static-management.git
El segundo submódulo ( external/pyfacebook) fue agregado por otro desarrollador en una rama de funciones. He heredado el desarrollo ahora y he comprobado la rama de funciones. Sin embargo, Git no extraerá el submódulo por mí. He intentado:
git submodule initgit submodule updategit submodule update --initgit submodule sync- Eliminando todas las definiciones de submódulos
.git/configy ejecutándosegit submodule init. Solo copia el submódulo existente anteriormente e ignora el nuevo. - Ingresar nuevas definiciones de submódulo de forma
.git/configmanual y en ejecucióngit submodule update. Solo los submódulos existentes anteriormente se molestan en actualizar.
en varias combinaciones, pero git simplemente no se actualizará en .git/configfunción del nuevo contenido de .gitmodules, ni creará la external/pyfacebookcarpeta y extraerá el contenido del submódulo.
¿Qué me estoy perdiendo? ¿Es .git/configrealmente necesaria la intervención manual (agregar una entrada de submódulo a mano ) y por qué?
Editar: la intervención manual no funciona. Agregar manualmente la nueva entrada de submódulo a .git/configno hace nada. El nuevo submódulo se ignora.
fuente

Respuestas:
¿Actualizó recientemente a la versión 1.7.0.4 de git? Lo hice y ahora tengo problemas similares ...
Editar: solucioné mi problema pero no tengo ni idea de dónde estaba el problema. Eliminé manualmente las entradas del submódulo de .git / config y .gitmodules y volví a agregar mis submódulos con los pasos ususales (git submodule add, etc.) ... Worksforme pero no agrega valor a este hilo.
fuente
Tuve este mismo problema: resultó que el archivo .gitmodules estaba comprometido, pero la confirmación del submódulo real (es decir, el registro del ID de confirmación del submódulo) no lo estaba.
Agregarlo manualmente pareció hacer el truco, por ejemplo:
(Incluso sin eliminar nada de .git / config o .gitmodules).
Luego confírmelo para registrar la identificación correctamente.
Agregando algunos comentarios adicionales a esta respuesta de trabajo: si la actualización del submódulo git init o la actualización del submódulo git no funciona, entonces, como se describe anteriormente, el submódulo git agregar url debería funcionar. Uno puede verificar esto por
y uno debería obtener una entrada del submódulo que desea extraer en el resultado del comando git config --list. Si hay una entrada de su submódulo en el resultado de la configuración, entonces ahora la actualización habitual del submódulo git --init debería extraer su submódulo. Para probar este paso, puede cambiar el nombre del submódulo manualmente y luego actualizar el submódulo.
Para saber si tiene cambios locales en el submódulo, se puede ver a través de git status -u (si desea ver cambios en el submódulo) o git status --ignore-submodules (si no desea ver los cambios en el submódulo).
fuente
external/pyfacebookpara?'your/local/path' already exists and is not a valid git repogit config --list | grep submodule | sed -e "s/submodule\.//" -e "s/\(.*\)\.url=\(.*\)/git submodule add --force \2 \1/" | bashgit versión 2.7.4. Este comando actualiza el código local
git submodule update --init --force --remotefuente
git submodule update --init --force --remote <module-name>.Tuve el mismo problema, cuando git ignora
inityupdateordena, y no hace nada.COMO ARREGLAR
Si se cumplen esos requisitos, funcionará. De lo contrario, todos los comandos se ejecutarán sin ningún mensaje ni resultado.
Si hiciste todo eso y todavía no funciona:
git submodule add git@... path/togit submodule initgit submodule update.gitmodulesy la carpeta del módulo (tenga en cuenta que el contenido de la carpeta no se confirmará).git/configtodavía no tenga submódulosgit submodule inity verá un mensaje de que el módulo registrógit submodule update- buscará el módulo.git/configy encontrará el submódulo registradofuente
Parece haber mucha confusión aquí (también) en las respuestas.
git submodule initno está destinado a generar cosas mágicamente en .git / config (desde .gitmodules). Tiene la intención de configurar algo en un subdirectorio completamente vacío después de clonar el proyecto principal, o extraer una confirmación que agrega un submódulo que no existía previamente.En otras palabras, sigue un
git cloneproyecto que tiene submódulos (que sabrá por el hecho de que el clon extrajo un archivo .gitmodules) por ungit submodule update --init --recursive.Usted no sigue
git submodule add ...con unagit submodule init(ogit submodule update --init), que no se supone que funciona. De hecho, el complemento ya actualizará el .git / config apropiado si las cosas funcionan.EDITAR
Si alguien más agregó un submódulo git que no existía anteriormente, y usted realiza una
git pullde esas confirmaciones, entonces el directorio de ese submódulo estará completamente vacío (cuando ejecutegit submodule statusel hash del nuevo submódulo debería ser visible pero tendrá un-frente de it.) En este caso, debe seguir sugit pulltambién con ungit submodule update --init(más--recursivecuando es un submódulo dentro de un submódulo) para obtener el submódulo nuevo, previamente no existente, verificado; al igual que después de un clon inicial de un proyecto con submódulos (donde obviamente tampoco tenía esos submódulos antes).fuente
git help submoduledice esto sobre init: "init: Inicializa los submódulos registrados en el índice (que fueron agregados y comprometidos en otro lugar) copiando los nombres de los submódulos y las URL de .gitmodules a .git / config". ¿Entonces parece que debería hacer exactamente lo que dices que no hace ...? ¿Es hora de actualizar la documentación de git?--initdebería ser necesario obtener nuevos submódulos (en lugar de tomarlos automáticamenteupdate)? Parece que la actualización de su repositorio debería tomar todo lo necesario a menos que destruya los datos. Con--initesto, te obliga a saber que se podrían haber creado nuevos submódulos, o simplemente emitir siempre un--initcada vez, en cuyo caso, nuevamente, parecería que debería estar habilitado por defecto.Tuve el mismo problema, pero ninguna de las soluciones anteriores ayudó. Las entradas en .gitmodules y en .git / config eran correctas pero el comando
git submodules update --init --recursiveno hacía nada. También eliminé el directorio del submódulo y lo ejecutégit submodules update --init --recursivey recuperé el directorio del submódulo, pero con exactamente la misma confirmación que antes.Encontré la respuesta en esta página . El comando es:
git submodule update --remotefuente
git submodule updatelugar degit submodule update --remote.Rasca eso. De hecho, lo hice funcionar
git submodule update --init --recursive. Espero que esto ayude.PD: asegúrate de estar en el directorio raíz de git, no en el del submódulo.
fuente
Pensar que la configuración manual
.gitmoduleses suficiente es INCORRECTOMi local
git version 2.22.0al momento de escribir este artículo.Entonces llegué a este hilo preguntándome por qué no estaba
git submodule initfuncionando; Configuré el.gitmodulesarchivo y procedí a hacergit submodule init...IMPORTANTE
git submodule add company/project.git includes/projectes necesario (al agregar el módulo por primera vez), esto:.git/config.gitmodulesarchivoincludes/projecten este ejemplo).usted debe entonces
git commitdespués de haber agregado el submódulo, esto va a cometer.gitmodulesy la ubicación sub-módulo de seguimiento.Cuando el proyecto se clona nuevamente, tendrá
.gitmodulesy el directorio de submódulos vacío (por ejemplo,includes/projecten este ejemplo). En este punto,.git/configtodavía no tiene la configuración del submódulo, hasta quegit submodule initse ejecuta, y recuerde que esto solo funciona porque.gitmodulesYincludes/projectse rastrean en el repositorio principal de git.También para referencia ver:
fuente
Según la respuesta de Dave James Miller, puedo confirmar que funcionó para mí. Lo importante aquí fue confirmar el ID de confirmación de los subproyectos. Solo tener la entrada en .gitmodules no fue suficiente.
Aquí hay un compromiso apropiado:
https://github.com/dirkaholic/vagrant-php-dev-box/commit/d5f4c40bdbd80eefbb5ac6029823733f591435ae
fuente
Yo tuve el mismo problema.
.gitmodulestenía el submódulo, pero después de ungit submodule initcomando no estaba en.git/config.Resulta que el desarrollador que agregó el submódulo también agregó el directorio del submódulo al
.gitignorearchivo. Eso no funciona.fuente
Al igual que tú, descubrí que la sincronización del submódulo git no hace lo que esperas que haga. Solo después de hacer un explícito de
git submodule addnuevo cambia la URL de un submódulo.Entonces, puse este script en
~/bin/git-submodule-sync.rb:https://gist.github.com/frimik/5125436
Y también uso la misma lógica en algunos scripts de implementación de git posteriores a la recepción.
Todo lo que necesito hacer ahora es editar
.gitmodules, luego ejecutar este script y finalmente funciona como pensé quegit submodule syncse suponía que debía hacerlo.fuente
Tuve el mismo problema hoy y me di cuenta de que porque escribí
git submodule initentonces tenía esas líneas en mi.git/config:Eliminé eso y escribí:
Y todo volvió a la normalidad, mi submódulo se actualizó en su subdirectorio como de costumbre.
fuente
El problema para mí es que el desarrollador anterior del repositorio había comprometido la
submodules/thingcarpeta como una carpeta normal, lo que significa que cuando intenté ejecutarlogit submodule add ..., fallaría con:,'submodules/thing' already exists in the indexpero intentar actualizar el submódulo también fallaría porque vio que la ruta no funcionaba contener un submódulo.Para solucionarlo, tuve que eliminar la
submodules/thingcarpeta, confirmar la eliminación y luego ejecutar elgit submodule addcomando para volver a agregarla correctamente:fuente
Cuando vi esto hoy, un desarrollador había movido parte del árbol a un nuevo subdirectorio y parece que su cliente git no registró las reglas del subproyecto actualizadas en el árbol, en su lugar, solo fueron destruidas, dejando la
.gitmodulesreferencia a ambas obsoletas. ubicaciones y subproyectos que ya no existían en el árbol actual.Agregando los submódulos nuevamente y comparando los shas de confirmación del submódulo con los encontrados en
git show $breaking_commit_sha(busque líneas que coincidan con regexp^-Subproject) para ajustar las cosas arregladas según sea necesario.fuente
Eliminar el directorio del submódulo y su contenido (carpeta "external / pyfacebook") si existe antes
git submodule add ...podría solucionar problemas.fuente
Tuve un problema similar con un submódulo. Simplemente no quería ser clonado / extraído / actualizado / lo que sea.
Al intentar volver a agregar el submódulo usando
git submodule add [email protected] destination, obtuve el siguiente resultado:Entonces, intenté hacer cumplir el comando add :
git submodule add --force [email protected] destinationEso funcionó en mi caso.
fuente
Para el registro:
creé el mismo problema agregando un repositorio vacío como submódulo. En este caso, no había ningún hash de referencia disponible para el submódulo, lo que provocó el error descrito por el póster original.
Forzar la adición del repositorio después de haberse comprometido a resolver el problema (como en la publicación de Arvids)
git submodule add --force [email protected] destinationfuente
.git/configgit submodule initcomandogit pull origin masterDebería funcionar ahora
fuente
Solo comparto lo que funcionó para mí:
Esto clona el repositorio remoto que ya incluye los submódulos. Esto significa que no necesitará ejecutar git submodule update o init después de la clonación.
fuente
El siguiente comando de sincronización resolvió el problema:
fuente