Git diff dice que el subproyecto está sucio

Resuelto mrwooster asked hace 13 años • 11 respuestas

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?

mrwooster avatar Feb 02 '11 18:02 mrwooster
Aceptado

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 -dirtyincluso 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=untrackedel 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-dirtygit describe --dirty

Y también establezca --ignore-submodules=noneel valor predeterminado para ( man ) para que el usuario no termine eliminando un submódulo que tiene archivos no confirmados (sin seguimiento).git status

git configahora 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 cdvaya 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-submodulesa su git 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
VonC avatar Feb 02 '2011 12:02 VonC

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í.

Devpool avatar Sep 11 '2018 13:09 Devpool

También eliminar el submódulo y luego ejecutarlo git submodule initobviamente git submodule updatefuncionará, pero puede que no siempre sea apropiado o posible.

user1178907 avatar Nov 14 '2012 23:11 user1178907

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 ignoreopción de configuración predeterminada en cada submódulo individual que desee ignorar (para ambos git diffy git status), ya sea en el .git/configarchivo (solo local) o .gitmodules(será versionado por git). Por ejemplo:

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

ignore = untrackedignorar solo los archivos sin seguimiento, ignore = dirtyignorar también los archivos modificados e ignore = allignorar también las confirmaciones. Aparentemente no hay forma de asignarlo como comodín para todos los submódulos.

Ralph Versteegen avatar Oct 01 '2016 05:10 Ralph Versteegen