Aquí está parte del contenido de mi .gitmodules
archivo:
[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/config
solo 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 init
git submodule update
git submodule update --init
git submodule sync
- Eliminando todas las definiciones de submódulos
.git/config
y ejecutándosegit submodule init
. Solo copia el submódulo existente anteriormente e ignora el nuevo. - Ingresar nuevas definiciones de submódulo de forma
.git/config
manual 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/config
función del nuevo contenido de .gitmodules
, ni creará la external/pyfacebook
carpeta y extraerá el contenido del submódulo.
¿Qué me estoy perdiendo? ¿Es .git/config
realmente 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/config
no 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/pyfacebook
para?'your/local/path' already exists and is not a valid git repo
git config --list | grep submodule | sed -e "s/submodule\.//" -e "s/\(.*\)\.url=\(.*\)/git submodule add --force \2 \1/" | bash
git versión 2.7.4. Este comando actualiza el código local
git submodule update --init --force --remote
fuente
git submodule update --init --force --remote <module-name>
.Tuve el mismo problema, cuando git ignora
init
yupdate
ordena, 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/to
git submodule init
git submodule update
.gitmodules
y la carpeta del módulo (tenga en cuenta que el contenido de la carpeta no se confirmará).git/config
todavía no tenga submódulosgit submodule init
y verá un mensaje de que el módulo registrógit submodule update
- buscará el módulo.git/config
y encontrará el submódulo registradofuente
Parece haber mucha confusión aquí (también) en las respuestas.
git submodule init
no 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 clone
proyecto 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 pull
de esas confirmaciones, entonces el directorio de ese submódulo estará completamente vacío (cuando ejecutegit submodule status
el hash del nuevo submódulo debería ser visible pero tendrá un-
frente de it.) En este caso, debe seguir sugit pull
también con ungit submodule update --init
(más--recursive
cuando 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 submodule
dice 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?--init
deberí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--init
esto, te obliga a saber que se podrían haber creado nuevos submódulos, o simplemente emitir siempre un--init
cada 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 --recursive
no hacía nada. También eliminé el directorio del submódulo y lo ejecutégit submodules update --init --recursive
y 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 --remote
fuente
git submodule update
lugar 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
.gitmodules
es suficiente es INCORRECTOMi local
git version 2.22.0
al momento de escribir este artículo.Entonces llegué a este hilo preguntándome por qué no estaba
git submodule init
funcionando; Configuré el.gitmodules
archivo y procedí a hacergit submodule init
...IMPORTANTE
git submodule add company/project.git includes/project
es necesario (al agregar el módulo por primera vez), esto:.git/config
.gitmodules
archivoincludes/project
en este ejemplo).usted debe entonces
git commit
después de haber agregado el submódulo, esto va a cometer.gitmodules
y la ubicación sub-módulo de seguimiento.Cuando el proyecto se clona nuevamente, tendrá
.gitmodules
y el directorio de submódulos vacío (por ejemplo,includes/project
en este ejemplo). En este punto,.git/config
todavía no tiene la configuración del submódulo, hasta quegit submodule init
se ejecuta, y recuerde que esto solo funciona porque.gitmodules
Yincludes/project
se 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.
.gitmodules
tenía el submódulo, pero después de ungit submodule init
comando no estaba en.git/config
.Resulta que el desarrollador que agregó el submódulo también agregó el directorio del submódulo al
.gitignore
archivo. 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 add
nuevo 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 sync
se suponía que debía hacerlo.fuente
Tuve el mismo problema hoy y me di cuenta de que porque escribí
git submodule init
entonces 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/thing
carpeta como una carpeta normal, lo que significa que cuando intenté ejecutarlogit submodule add ...
, fallaría con:,'submodules/thing' already exists in the index
pero 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/thing
carpeta, confirmar la eliminación y luego ejecutar elgit submodule add
comando 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
.gitmodules
referencia 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] destination
Eso 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] destination
fuente
.git/config
git submodule init
comandogit pull origin master
Deberí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