tag - Git no iniciará/sincronizará/actualizará nuevos submódulos
submodulos git (13)
Aquí hay parte de los contenidos de mi archivo .gitmodules
:
[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 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
- Eliminando todas las definiciones de submódulo de
.git/config
y ejecutando elgit submodule init
. Solo copia sobre el submódulo existente previamente e ignora el nuevo. - Introducir nuevas definiciones de submódulo en
.git/config
manualmente y ejecutar lagit submodule update
. Solo los submódulos previamente existentes se molestan en actualizar.
en varias combinaciones, pero git simplemente no actualizará .git/config
basándose en los nuevos contenidos de .gitmodules
, ni creará la carpeta external/pyfacebook
los contenidos del submódulo.
¿Qué me estoy perdiendo? ¿Es realmente necesaria la intervención manual (agregar una entrada de submódulo a mano a .git/config
) y por qué?
Editar: la intervención manual no funciona. Agregar manualmente la nueva entrada del submódulo a .git/config
no hace nada. El nuevo submódulo se ignora.
Más o menos mágicamente, pero hoy ejecuté
git submodule init
seguido degit submodule sync
seguido porgit submodule update
y comenzó a extraer mis submódulos ... Magic? ¡Quizás! Esta es realmente una de las experiencias más molestas con Git ...
Rasca eso. De hecho lo conseguí trabajando haciendo la 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.
¿Has actualizado recientemente a la versión de Git 1.7.0.4? Lo hice y ahora tengo problemas similares ...
Editar: arreglé 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.
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, sino que simplemente fueron .gitmodules
, dejando .gitmodules
refiriéndose a ambos a ubicaciones obsoletas y a subproyectos que ya no existían en el árbol actual.
Al volver a agregar los submódulos y al comparar los commit shas del submódulo con los encontrados en git show $breaking_commit_sha
(buscar líneas que coincidan con regexp ^-Subproject
) para ajustar las cosas que se necesiten.
Eliminar el directorio del submódulo y su contenido (carpeta "external / pyfacebook") si existe antes de git submodule add ...
podría solucionar problemas.
Igual que usted, descubrí que la sincronización del submódulo de git no hace lo que espera que haga. Solo después de hacer un git submodule add
explícito, git submodule add
nuevamente 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 algunas secuencias de comandos 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 creía que se suponía que era la git submodule sync
.
Parece que hay mucha confusión aquí (también) en las respuestas.
git submodule init
no está 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, sigues un git clone
de un proyecto que tiene submódulos (que sabrás por el hecho de que el clon comprobó un archivo .gitmodules) mediante una git submodule update --init --recursive
.
No sigue el git submodule add ...
con un git submodule init
(o la git submodule update --init
), que se supone que no funciona. De hecho, el complemento ya actualizará el .git / config apropiado si las cosas funcionan.
EDITAR
Si alguien más agregó un submódulo de git previamente inexistente, y usted hace un git pull
de esa confirmación, entonces el directorio de ese submódulo estará completamente vacío (cuando ejecute el git submodule status
del git submodule status
el hash del nuevo submódulo debería estar visible, pero tener un -
en frente de él.) En este caso, debe seguir su git pull
también con una 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).
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 para tener la entrada en .gitmodules no fue suficiente.
Aquí hay una confirmación apropiada:
https://github.com/dirkaholic/vagrant-php-dev-box/commit/d5f4c40bdbd80eefbb5ac6029823733f591435ae
Tuve el mismo problema hoy y descubrí que porque escribí git submodule init
entonces tenía esa línea en mi .git/config
:
[submodule]
active = .
Lo eliminé y escribí:
git submodule update --init --remote
Y todo volvió a la normalidad, mi submódulo se actualizó en su subdirectorio como de costumbre.
Tuve el mismo problema, cuando git ignoró los comandos init
y update
, y no hace nada.
COMO ARREGLAR
- Su carpeta de submódulo debe ser confirmada en git repo
- No debería estar en .gitignore
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:
- Agregue el submódulo manualmente, por ejemplo,
git submodule add git@... path/to
-
git submodule init
-
git submodule update
- confirmar y enviar todos los archivos -
.gitmodules
y su carpeta de módulo (tenga en cuenta que el contenido de la carpeta no se confirmará) - deja tu repositorio git local
- clonar uno nuevo
- asegúrese de que
.git/config
aún no tenga ningún submódulo - Ahora,
git submodule init
- y verá un mensaje que el módulo registrado -
git submodule update
: buscará el módulo - Ahora mira
.git/config
y encontrarás el submódulo registrado
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.
Agregarlo manualmente parecía ser el truco, por ejemplo:
git submodule add http://github.com/sciyoshi/pyfacebook.git external/pyfacebook
(Incluso sin eliminar nada de .git / config o .gitmodules).
Luego comprométalo a grabar la identificación 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 submodule add url debería hacer el truco. Uno puede verificar esto por
git config --list
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 manualmente el nombre del submódulo y luego actualizar el submódulo.
mv yourmodulename yourmodulename-temp
git submodule update --init
Para saber si tiene cambios locales en el submódulo, se puede ver a través del estado de git -u (si desea ver cambios en el submódulo) o el estado de git --ignore-submódulos (si no desea ver los cambios en el submódulo).
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 el submódulo git submodule add [email protected] destination
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.
Entonces, traté de aplicar el comando agregar :
git submodule add --force [email protected] destination
Eso funcionó en mi caso.
Yo tuve el mismo problema.
.gitmodules
tenía el submódulo, pero después de un comando git submodule init
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.
git versión 2.7.4. Este comando actualiza el código local git submodule update --init --force --remote