the submodulos submodules submodule inside index explained already absorbgitdirs git git-submodules

submodulos - gitlab submodules



Git diff dice que el subproyecto está sucio (8)

Como se menciona en la publicación del blog de Mark Longair Explicación de los submódulos de Git ,

Las versiones 1.7.0 y posteriores de git contienen un cambio molesto en el comportamiento del submódulo git.
Los submódulos ahora se consideran sucios si tienen archivos modificados o archivos sin seguimiento , mientras que anteriormente solo sería el caso si HEAD en el submódulo apuntaba a una confirmación incorrecta.

El significado del signo más ( + ) en la salida del submódulo git ha cambiado, y la primera vez que te encuentras con esto, toma un poco de tiempo descubrir qué está pasando mal, por ejemplo, mirando a través de los registros de cambios o usando git bisect en git.git para encontrar el cambio. Hubiera sido mucho más amable para los usuarios introducir un símbolo diferente para "en la versión especificada, pero sucio".

Puedes arreglarlo por:

  • ya sea cometiendo o deshaciendo los cambios / evoluciones dentro de cada uno de sus submódulos, antes de volver al repositorio principal (donde el diff ya no debería informar los archivos "sucios"). Para deshacer todos los cambios en su submódulo, solo haga git checkout . en el directorio raíz de su submódulo y realice la git checkout .

    dotnetCarpenter comments que puedes hacer una: git submodule foreach --recursive git checkout .

  • o agregue --ignore-submodules a su git diff , para ignorar temporalmente esos submódulos "sucios".

Nuevo en la versión 1.7.2 de Git

Como comenta Noam continuación , esta pregunta menciona que, desde la versión 1.7.2 de git, puede ignorar los submódulos sucios con:

git status --ignore-submodules=dirty

Acabo de ejecutar un git diff, y obtengo la siguiente salida para todos mis aproximadamente 10 submódulos

diff --git a/.vim/bundle/bufexplorer b/.vim/bundle/bufexplorer --- a/.vim/bundle/bufexplorer +++ b/.vim/bundle/bufexplorer @@ -1 +1 @@ -Subproject commit 8c75e65b647238febd0257658b150f717a136359 +Subproject commit 8c75e65b647238febd0257658b150f717a136359-dirty

¿Qué significa esto? ¿Cómo lo arreglo?


Desafortunadamente, no parece haber opciones de configuración para hacer que "git diff --ignore-submodules" y "git status --ignore-submodules" sean los valores predeterminados globales (pero ver también Establecer indicadores predeterminados de git en los comandos ). Sin embargo, puede establecer una opción predeterminada de ignore configuración en cada submódulo individual que desea ignorar (tanto para el estado de git diff como para el git status ), ya sea en el archivo .git/config (solo local) o .gitmodules (git lo versionará). Por ejemplo:

[submodule "foobar"] url = [email protected]:foo/bar.git ignore = untracked

ignore = untracked para ignorar solo los archivos sin seguimiento, ignore = dirty para ignorar también los archivos modificados e ignore = all para ignorar también los commits. Aparentemente no hay forma de comodín para todos los submódulos.


En mi caso, no estaba seguro de qué había provocado esto, pero sabía que solo quería que los submódulos se reiniciaran a su último compromiso remoto y terminé con eso. Esto implicó combinar respuestas de un par de preguntas diferentes aquí:

git submodule update --recursive --remote --init

Fuentes:

¿Cómo reverso mis cambios a un submódulo de git?

Una forma sencilla de extraer los últimos submódulos de git


Este es el caso porque el puntero que tiene para el submódulo no es lo que está realmente en el directorio del submódulo. Para solucionar esto, debe ejecutar la git submodule update nuevamente:


También eliminar el submódulo y luego ejecutar el git submodule init y la git submodule update obviamente hará el truco, pero puede no ser siempre apropiado o posible.


Terminé eliminando el directorio de submódulos e inicializándolo nuevamente

cd my-submodule git push cd ../ rm -rf my-submodule git submodule init git submodule update


Un submódulo puede marcarse como sucio si la configuración de modo de archivo está habilitada y usted cambió los permisos de archivo en el subárbol de submódulo.

Para desactivar el modo de archivo en un submódulo, puede editar /.git/modules/path/to/your/submodule/config y agregar

[core] filemode = false

Si desea ignorar todos los estados sucios, puede establecer ignore = dirty propiedad ignore = dirty en el archivo /.gitmodules , pero creo que es mejor desactivar el modo de archivo solamente.


git submodule foreach --recursive git checkout .

Esto no funcionó, pero me dio una lista de archivos (en mi caso solo uno) que habían sido cambiados en el submódulo (sin que yo hiciera nada allí).

Así que pude ir al submódulo y el estado de git me mostró que mi HEAD estaba separada -> git checkout master, git status para ver el archivo modificado una vez más, git checkout> filename <, git pull y todo bien otra vez.