Git diff dice que el subproyecto está sucio
Acabo de ejecutar un git diff y obtengo el siguiente resultado 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é quiere decir esto? ¿Cómo lo soluciono?
Actualización de enero de 2021, diez años después:
" git diff
" ( man ) mostró un árbol de trabajo de submódulo con archivos sin seguimiento como confirmación de submódulo <objectname>-dirty
, pero una expectativa natural es que el " -dirty
" indicador se alinee con " git describe --dirty
" ( man ) , que no considera tener archivos sin seguimiento en el árbol de trabajo como fuente de suciedad.
La inconsistencia se solucionó con Git 2.31 (primer trimestre de 2021).
Consulte el compromiso 8ef9312 (10 de noviembre de 2020) de Sangeeta Jain ( sangu09
) .
(Fusionado por Junio C Hamano -- gitster
-- en el compromiso 0806279 , 25 de enero de 2021)
diff
: no muestra el submódulo con archivos sin seguimiento como "-dirty
"Aprobado por: Sangeeta Jain
Git diff informa un directorio de submódulo
-dirty
incluso cuando solo hay archivos sin seguimiento en el directorio de submódulo.
Esto es inconsistente con lo que dice ( man ) cuando se ejecuta en el directorio del submódulo en ese estado.git describe --dirty
Establezca
--ignore-submodules=untracked
el valor predeterminado para ( man ) cuando no haya una variable de configuración ni una opción de línea de comando, de modo que el comando no dé el sufijo '' a un submódulo cuyo árbol de trabajo tenga archivos sin seguimiento, para que sea coherente con lo que se ejecuta en el submódulo de trabajo. árbol.git diff
-dirty
git describe --dirty
Y también establezca
--ignore-submodules=none
el valor predeterminado para ( man ) para que el usuario no termine eliminando un submódulo que tiene archivos no confirmados (sin seguimiento).git status
git config
ahora incluye en su página de manual :
De forma predeterminada, esto está configurado como sin seguimiento para que se ignoren los submódulos sin seguimiento.
Respuesta original (2011)
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 de git.
Los submódulos ahora se consideran sucios si tienen archivos modificados o archivos sin seguimiento , mientras que anteriormente solo sería así 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, lleva un poco de tiempo descubrir qué está pasando mal, por ejemplo, mirando los registros de cambios o usando git bisect en git. .git para encontrar el cambio. Habría sido mucho más amable para los usuarios introducir un símbolo diferente para "en la versión especificada, pero sucia".
Puedes solucionarlo mediante:
- ya sea confirmando o deshaciendo los cambios/evoluciones dentro de cada uno de sus submódulos, antes de volver al repositorio principal (donde la diferencia ya no debería informar archivos "sucios"). Para deshacer todos los cambios en su submódulo simplemente
cd
vaya al directorio raíz de su submódulo y hagagit checkout .
dotnetCarpenter comenta que puedes hacer:git submodule foreach --recursive git checkout .
- o agréguelo
--ignore-submodules
a sugit diff
, para ignorar temporalmente esos submódulos "sucios".
Nuevo en Git versión 1.7.2
Como comenta Noam a continuación , esta pregunta menciona que, desde la versión 1.7.2 de git, puedes ignorar los submódulos sucios con:
git status --ignore-submodules=dirty
Para ignorar todos los archivos sin seguimiento en cualquier submódulo, utilice el siguiente comando para ignorar esos cambios.
git config --global diff.ignoreSubmodules dirty
Agregará la siguiente opción de configuración a su configuración de git local:
[diff]
ignoreSubmodules = dirty
Puede encontrar más información aquí.
También eliminar el submódulo y luego ejecutarlo git submodule init
obviamente git submodule update
funcionará, pero puede que no siempre sea apropiado o posible.
EDITAR : Esta respuesta (y la mayoría de las otras) están obsoletas; vea la respuesta de Devpool en su lugar .
Originalmente, no había opciones de configuración para hacer que " git diff --ignore-submodules
" y " git status --ignore-submodules
" fueran los valores predeterminados globales (pero consulte también Configuración de indicadores predeterminados de git en los comandos ). Una alternativa es establecer una ignore
opción de configuración predeterminada en cada submódulo individual que desee ignorar (para ambos git diff
y git status
), ya sea en el .git/config
archivo (solo local) o .gitmodules
(será versionado por git). Por ejemplo:
[submodule "foobar"]
url = [email protected]:foo/bar.git
ignore = untracked
ignore = untracked
ignorar solo los archivos sin seguimiento, ignore = dirty
ignorar también los archivos modificados e ignore = all
ignorar también las confirmaciones. Aparentemente no hay forma de asignarlo como comodín para todos los submódulos.