El submódulo de Git muestra nuevas confirmaciones, el estado del submódulo no dice nada para confirmar

47

En un repositorio git, he configurado mi archivo .gitmodules para hacer referencia a un repositorio github:

[submodule "src/repo"]
    path = src/repo
    url = repourl

cuando 'git status' en este repositorio, muestra:

On branch master
Your branch is up-to-date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

modified:   src/repo (new commits)

Si hago cd en src / repo y git status en repo, dice que no hay nada que comprometer.

¿Por qué se queja mi repositorio git de nivel superior?

Catherine Holloway
fuente

Respuestas:

42

Esto se debe a que Git registra qué confirmación (no una rama o una etiqueta, exactamente una confirmación representada en el hash SHA-1) debe verificarse para cada submódulo. Si cambia algo en el directorio de submódulos, Git lo detectará y le instará a confirmar esos cambios en el repositorio de nivel superior.

Ejecute git diffen el repositorio de nivel superior para mostrar lo que realmente ha cambiado, piensa Git. Si ya ha realizado algunas confirmaciones en su submódulo (por lo tanto, "limpio" en el submódulo), informa el cambio de hash del submódulo.

$ git diff
diff --git a/src/repo b/src/repo
index b0c86e2..a893d84 160000
--- a/src/repo
+++ b/src/repo
@@ -1 +1 @@
-Subproject commit b0c86e28675c9591df51eedc928f991ca42f5fea
+Subproject commit a893d84d323cf411eadf19569d90779610b10280

De lo contrario, muestra un -dirtycambio hash que no puede organizar o comprometer en el depósito de nivel superior. git statustambién afirma que el submódulo tiene contenido no rastreado / modificado.

$ git diff
diff --git a/src/repo b/src/repo
--- a/src/repo
+++ b/src/repo
@@ -1 +1 @@
-Subproject commit b0c86e28675c9591df51eedc928f991ca42f5fea
+Subproject commit b0c86e28675c9591df51eedc928f991ca42f5fea-dirty

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
  (commit or discard the untracked or modified content in submodules)

    modified:   src/repo (untracked content)

no changes added to commit (use "git add" and/or "git commit -a")

Para actualizar qué registros de confirmación deben verificarse para el submódulo, debe confirmar git el submódulo además de confirmar los cambios en el submódulo:

git add src/repo
yaegashi
fuente
1
¿Qué sucede si no quiero agregar ninguna confirmación en el repositorio principal? Mi caso de uso es: tengo un repositorio principal, luego tengo su wiki, que también es un repositorio (como está disponible en GitHub y Bitbucket). Ahora he agregado wikicomo submódulo en un directorio wiki . No quiero que ninguno de mis cambios desde wiki(es decir, el directorio wiki ) se refleje en mi repositorio principal / código. ¿Debo agregar la .gitmodules ruta en mi .gitignoredel repositorio principal? ¿Cómo debo hacerlo?
yadav_vi
14
En mi caso, todo lo que tenía que hacer era actualizar el submódulo en sí desde el repositorio principal. Algo así como:git submodule update src/repo
Agustín Amenabar
19

Me encontré con esta misma clase de problema y pude usar la solución ofrecida por @AugustinAmenabar en la sección de comentarios de la respuesta aceptada. Mi configuración fue un poco más compleja, así que agregué la --recursivebandera para actualizar todas las dependencias.

git submodule update src/repo --recursive

Zak
fuente