2010-07-26 13 views
71

Esto es parte de los contenidos de mi .gitmodules archivo:Git no init/sincronización/actualizar nuevos submódulos

[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 sólo contiene la primera:

[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 características. Heredé el desarrollo ahora y he revisado la rama de características. 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
  • Eliminación de todas las definiciones submódulo de .git/config y funcionando git submodule init. Solo copia sobre el submódulo existente previamente e ignora el nuevo.
  • Ingresando nuevas definiciones de submódulos en .git/config manualmente y ejecutando git submodule update. Solo los submódulos previamente existentes se molestan en actualizar.

en varias combinaciones, pero Git simplemente no actualizará .git/config basado en los nuevos contenidos de .gitmodules, ni va a crear la carpeta external/pyfacebook y tirar el contenido del submódulo.

¿Qué me estoy perdiendo? ¿Es realmente necesaria la intervención manual (agregar una entrada de submódulo a mano al .git/config) 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.

+1

ejecutando 1.7.7.1 y teniendo el mismo problema: "git submodule sync" no actualiza .git/config después de un cambio a .gitmodules. –

+1

Este artículo es útil: https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ –

Respuesta

25

¿Ha actualizado recientemente a la versión de Git 1.7.0.4? Lo hice y ahora estoy teniendo problemas similares ...

Editar: He solucionado mi problema, pero no tengo ni idea de dónde estaba el problema. Eliminé manualmente las entradas de los submódulos tanto de .git/config como de .gitmodules y volví a agregar mis submódulos con los pasos usuales (git submodule add etc ...) ... Worksforme pero no agrega ningún valor a este hilo.

+0

Ahora tengo 1.7.2, pero creo que he tenido el problema desde al menos 1.6.x. –

+0

Y sí, ahora que lo pienso, terminé teniendo que hacer lo que describes (¡Olvidé que esta pregunta todavía estaba abierta!). Si no te importa pulir tu respuesta un poco, la aceptaré. –

+6

Esta es una debilidad continua de git. Incluso svn es mejor con externos. –

60

Tuve el mismo problema: resultó que el archivo .gitmodules se había confirmado, pero la confirmación real del submódulo (es decir, el registro de la identificación de confirmación del submódulo) no.

Adición parecía manualmente para hacer el truco - ej .:

git submodule add http://github.com/sciyoshi/pyfacebook.git external/pyfacebook 

(Incluso sin quitar nada de .git/config o .gitmodules.)

Luego se comprometen a registrar el ID correctamente.

Agregando algunos comentarios adicionales a esta respuesta de trabajo: Si la actualización del submódulo git init o git no funciona, entonces como se describe arriba, git submelule add url debería hacer el truco.Uno puede cruzar comprobar esto

git config --list 

y uno debe tener una entrada del submódulo 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 manualmente el nombre del submódulo y luego actualizar el submódulo.

mv yourmodulename yourmodulename-temp 
git submodule update --init 

Para averiguar si tiene cambios locales en el submódulo, se puede ver a través -u git status (si desea ver los cambios en el submódulo) o git status --ignore-submódulos (si no quiero ver los cambios en el submódulo).

+0

¿Para qué sirve 'external/pyfacebook'? –

+1

@IgorGanapolsky Esa es la ruta de destino para su submódulo. – yuhua

+0

Esto me ayudó, ¡muchas gracias!Podría agregar que si la ruta de destino ya existe (lo que hizo por mí como resultado de probar otros comandos) uno obtiene el siguiente mensaje que simplemente aumenta la confusión: '' 'your/local/path' ya existe y es no es un git repo válido'' –

2

que tenían el mismo problema.

.gitmodules tenían el submódulo, pero después de un comando git submodule init que no estaba en .git/config.

Resulta que el desarrollador que agregó el submódulo también agregó el directorio del submódulo al archivo .gitignore. Eso no funciona.

2

Igual que yo encontré que la sincronización del submódulo git no hace lo que espera que haga. Solo después de hacer un git submodule add explícito vuelve a cambiar el url de un submódulo.

Por lo tanto, puse este script en ~/bin/git-submodule-sync.rb:

https://gist.github.com/frimik/5125436

Y también utilizo la misma lógica en unos pocos git posterior a recibir desplegar las escrituras.

Todo lo que tengo que hacer ahora es editar .gitmodules, luego ejecutar este script y finalmente funciona como creí git submodule sync.

+0

Esto realmente funciona. – JeffCharter

+0

Esto parece suceder solo en algunos repositorios ... posiblemente debido a algún error en Git. No me ha sucedido en repositorios * recientemente * creados durante mucho tiempo, pero mucho antes, solía ocurrir todo el tiempo en ciertos repositorios ... – fridh

1

Cuando vi esto hoy, un desarrollador había movido parte del árbol a un nuevo subdirectorio y parece como si su cliente de git no registrara las reglas de Subproyecto actualizadas en el árbol, en vez de eso fueron simplemente numeradas, dejando .gitmodules haciendo referencia tanto a ubicaciones obsoletas como a subproyectos que ya no existían en el árbol actual.

Añadiendo los submódulos de nuevo, y comparando los commit shas del submódulo con los encontrados en git show $breaking_commit_sha (busque las líneas que coincidan con la expresión regular ^-Subproject) para ajustar las cosas cuando sea necesario.

3

Una especie de magia, pero hoy me encontré con git submodule init seguido por git submodule sync seguido por git submodule update y comenzó tirando de mis submódulos ... magia? ¡Quizás!Este es realmente uno de los más molestos experiencias con Git ...

reutilizables que. De hecho lo hice funcionar haciendo git submodule update --init --recursive. Espero que esto ayude.

PD: asegúrese de estar en el directorio root git, no en el del submódulo.

+0

Nah esto no hace absolutamente nada para mí. –

+0

@IgorGanapolsky He editado la respuesta anterior con lo que funcionó para mí. ¡Déjame saber si funciona! –

+0

Probé tus nuevos comandos, pero tampoco hicieron nada. –

9

tenían el mismo problema, cuando git ignorado init y update comandos, y no hace nada.

cómo solucionar

  1. La carpeta submódulo deberían comprometerse en repositorio git
  2. No debería ser en .gitignore

Si que los requisitos cumplidos para que funcione. De lo contrario, todos los comandos se ejecutarán sin ningún mensaje ni resultado.

Si lo hizo todo eso, y todavía no funciona:

  1. Añadir submódulo de forma manual, por ejemplo, git submodule add [email protected] path/to
  2. git submodule init
  3. git submodule update
  4. cometer y empujar todos los archivos - .gitmodules y su carpeta de módulo (nota, que el contenido de la carpeta no se comprometerá)
  5. dejar su repositorio git local de
  6. clon de uno nuevo
  7. asegúrese de que .git/config aún no tiene ningún submódulo
  8. Ahora, git submodule init - y verá un mensaje de ese módulo registrada
  9. git submodule update - buscará módulo
  10. Ahora mira .git/config y encontrará submódulo registrada
+0

git submódulo agregar git @ ... ruta/a - hizo el truco para mí –

27

Git versión 2.7.4. Este comando actualiza el código local git submodule update --init --force --remote

+2

No hacer nada por mí. –

+1

con respecto a git-submódulo [documentación] (https://git-scm.com/docs/git-submodule#git-submodule---remote) el comando antes mencionado debería actualizar la rama local de los submódulos. – palik

3

No parece haber mucha confusión aquí (también) en las respuestas.

git submodule init es no destinado a generar mágicamente cosas en .git/config (de .gitmodules). Está destinado a configurar algo en un subdirectorio completamente vacío después de clonar el proyecto principal, o al tirar de un compromiso que agrega un submódulo que anteriormente no existía.

En otras palabras, sigue un git clone de un proyecto que tiene submódulos (que sabrá por el hecho de que el clon comprobó un archivo .gitmodules) por un git submodule update --init --recursive.

Haces no siguen git submodule add ... con un git submodule init (o git 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 un no-existente submódulo previamente git se añadió por otra persona, y que haga un git pull de esa confirmación, a continuación, el directorio de esa sub-módulo estará completamente vacío (cuando se ejecuta git submodule status la el hash del nuevo submódulo debería ser visible, pero tendrá un - delante.) En este caso, debe seguir su git pull también con un git submodule update --init (más --recursive cuando es un submódulo dentro de un submódulo) para obtener el nuevo, previamente no -existente, submódulo prestado; justo como después de una copia inicial de un proyecto con submódulos (donde obviamente tampoco tenías esos submódulos).

+0

Eso es interesante, porque 'git help submodule' dice esto sobre init:" init: Inicializa los submódulos grabados en el índice (que fueron agregados y confirmados en otro lugar) copiando los nombres de los submódulos y las URL de .gitmodules a .git/config. " ¿Así que seguro * suena * como debería hacer exactamente lo que dices que no hace ...? ¿Hora de una actualización sobre la documentación de git? – Brad

+0

@brad No creo haber dicho eso, pero agregué una aclaración para ese caso específico. Gracias. –

+0

@CarloWood ¿Alguna idea de por qué los escritores de los submódulos de git decidieron que '--init' debería ser necesario para obtener nuevos submódulos (en lugar de agarrarlos automáticamente en' update')? Parece que la actualización de su repositorio debe tomar todo lo necesario a menos que destruya los datos. Con '--init' te obliga a saber que podrían haberse creado nuevos submódulos, o simplemente emitir un' --init' cada vez, en cuyo caso, de nuevo, parecería que debería estar habilitado por defecto. – Catskul

0

tuve el mismo problema hoy y dado cuenta de que ya he escrito git submodule init luego tuve aquellos línea en mi .git/config:

[submodule] 
    active = . 

me quita eso y proporcionado:

git submodule update --init --remote 

y todo estaba volviendo a la normalidad, mi submódulo actualizado en su subdirectorio como de costumbre.

0

Eliminar el submódulo dir y su contenido (carpeta "external/pyfacebook") si existe antes de git submodule add ... puede solucionar problemas.

1

Tuve un problema similar con un submódulo. Simplemente no quería ser clonado/sacado/actualizado/lo que sea.

Al intentar volver a agregar el submódulo usando git submodule add [email protected] destination me dieron el siguiente resultado:

A git directory for 'destination' is found locally with remote(s): 
    origin  [email protected] 
If you want to reuse this local git directory instead of cloning again from 
    [email protected] 
use the '--force' option. If the local git directory is not the correct repo 
or you are unsure what this means choose another name with the '--name' option. 

Por lo tanto, traté de hacer cumplir el mandato add:
git submodule add --force [email protected] destination

que funcionó en mi caso.

Cuestiones relacionadas