Como se menciona en la publicación del blog de Mark Longair, Git Submodules Explained ,
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 no rastreados , mientras que anteriormente solo sería el caso si HEAD en el submódulo señalaba la 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á mal, por ejemplo, mirando a través de 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 de la siguiente manera:
ya sea confirmando 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 reportar archivos "sucios"). Para deshacer todos los cambios en su submódulo solo cd
en el directorio raíz de su submódulo y hacergit checkout .
dotnetCarpenter comenta que puedes hacer:git submodule foreach --recursive git checkout .
o agregue --ignore-submodules
a su git diff
, para ignorar temporalmente esos submódulos "sucios".
Nuevo en Git versión 1.7.2
Como Noam comenta a 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
git commit -a
sin tener que preocuparse de agregar estos cambios. Aunque están marcadosM
en el frente, no terminarán en tu commit.git clean -id
.git submodule foreach --recursive git clean -id
(para probar primero en un repositorio de respaldo;)).gitignore
. Agregarlos allí o a mi lista global de ignorados solucionó cosas.También eliminar el submódulo y luego ejecutarlo
git submodule init
ygit submodule update
obviamente hará el truco, pero puede que no siempre sea apropiado o posible.fuente
Para ignorar todos los archivos no rastreados en cualquier submódulo, use el siguiente comando para ignorar esos cambios.
Agregará la siguiente opción de configuración a su configuración local de git:
Puede encontrar más información aquí.
fuente
EDITAR : Esta respuesta (y la mayoría de las otras) son obsoletas; ver la respuesta de Devpool en su lugar .
Originalmente, no había opciones de configuración para hacer "
git diff --ignore-submodules
" y "git status --ignore-submodules
" el valor predeterminado global (pero vea también Establecer indicadores predeterminados de git en los comandos ). Una alternativa es establecer un valor predeterminadoignore
opción de configuración en cada submódulo individual que desee ignorar (para ambosgit diff
ygit status
), ya sea en el.git/config
archivo (solo local) o.gitmodules
(será versionado por git). Por ejemplo:ignore = untracked
para ignorar solo los archivos no rastreados,ignore = dirty
ignorar también los archivos modificados eignore = all
ignorar también los commits. Aparentemente no hay forma de comodín para todos los submódulos.fuente
Este es el caso porque el puntero que tiene para el submódulo no es el que está realmente en el directorio de submódulos. Para solucionar esto, debe ejecutar
git submodule update
nuevamente:fuente
Esto no funcionó, pero me dio una lista de archivos (en mi caso, solo uno) que habían sido modificados en el submódulo (sin que yo hiciera nada allí).
Entonces pude ir al submódulo y el estado de git me mostró que mi CABEZA estaba desconectada -> git checkout master, git status para ver el archivo modificado una vez más, git checkout> filename <, git pull y todo bien nuevamente.
fuente
Terminé eliminando el directorio de submódulos e inicializándolo nuevamente
fuente
Un submódulo puede marcarse como sucio si la configuración del modo de archivo está habilitada y usted cambió los permisos de archivo en submódulo subárbol.
Para deshabilitar el modo de archivo en un submódulo, puede editar /.git/modules/path/to/your/submodule/config y agregar
Si desea ignorar todos los estados sucios, puede establecer la
ignore = dirty
propiedad en el archivo /.gitmodules , pero creo que es mejor deshabilitar solo el modo de archivo.fuente
En mi caso, no estaba seguro de qué había causado que esto sucediera, pero sabía que solo quería que los submódulos se restablecieran a su último compromiso remoto y terminaran. Esto implicó combinar las respuestas de un par de preguntas diferentes aquí:
git submodule update --recursive --remote --init
Fuentes:
¿Cómo revierto mis cambios a un submódulo git?
Manera fácil de extraer el último de todos los submódulos git
fuente