Git: ¿puedo suprimir la lista de 'contenido modificado' / entradas de submódulos sucios en estado, diff, etc.?

123

En algún momento (alrededor de las versiones 1.6.x, creo), git se dio cuenta de los cambios dentro de los submódulos. Eso solo sirve para molestarme:

$ git vendedor de estado | grep modificado:
# modificado: proveedor / rieles (contenido modificado)
$ git diff proveedor /
diff --git a / vendedor / rieles b / vendedor / rieles
--- a / vendedor / rieles
+++ b / vendedor / rieles
@@ -1 +1 @@
-Subproject commit 046c900df27994d454b7f906caa0e4226bb42b6f
+ Subproyecto commit 046c900df27994d454b7f906caa0e4226bb42b6f-dirty

Por favor haz que pare?

Editar:

Ok, entonces tengo una respuesta. Ahora tengo otra pregunta:

¿Puedo poner esto ~/.gitconfig? Desde mi inicial parece que no puedo, y no vi nada prometedor al rozar el parche. (Creo que aún puedo hacer un alias).

kch
fuente
Veo algunos parches en la lista de correo de git con respecto a esto, que data de junio de 2010. Así que espero que esté en un próximo lanzamiento. (google para 'git "--ignore-submodules = dirty"')
kch
¡+1 por explicar por qué ocurre el mensaje!
dotancohen

Respuestas:

175

Incluso existe la posibilidad de establecer el modo de ignorar para cada submódulo agregado dentro del archivo .gitmodules.

Justo hoy me encontré con este problema e inmediatamente escribí un artículo en mi blog sobre él después de encontrar una solución: Cómo ignorar los cambios en los submódulos git

La esencia de esto:

Una vez que haya agregado un submódulo, habrá un archivo nombrado .gitmodulesen la raíz de su repositorio

Simplemente agregue una línea a ese .gitmodulesarchivo:

[submodule "bundle/fugitive"]
    path = bundle/fugitive
    url = git://github.com/tpope/vim-fugitive.git
    ignore = dirty
NilsHaldenwang
fuente
55
+1, pero incluí la parte principal de la publicación de tu blog en tu respuesta sobre SO: tu enlace externo puede volverse inválido algún día, a diferencia de las respuestas de SO que vivirán para siempre (a través de los volcados de SO: blog.stackoverflow.com/2009/ 06 / ... )
VonC
55
Descubrí que necesitaba confirmar el archivo .gitmodules antes de git statustrabajar como se esperaba. También necesitas al menos 1.7.4 o mejor, creo.
aleemb
Para el .gitignorearchivo, hay una versión privada llamada exclude, ubicada en .git/info/, que no se maneja versión. ¿Existe un archivo correspondiente para el .gitmodulesarchivo que le permita suprimir los cambios en el submódulo solo en su instancia del repositorio principal, sin realizar cambios en .gitmodules?
HelloGoodbye
2
No puedo hacer que esto funcione con un submódulo que rastrea una rama. ¿No es compatible con eso? `` `[submódulo" smstack / ansible / hosts "] ruta = smstack / ansible / hosts url = https: // ... branch = master ignore = dirty` `` `` `
Marc Abramowitz
1
@MarcAbramowitz Me he topado con el mismo problema, creo. ¿Encontraste alguna solución para esto?
Sebastian G. Marinescu
61

Hay dos tipos de avisos de cambio que puede suprimir.

Lo primero es lo untracked contentque sucede cuando realiza cambios en su submódulo pero aún no los ha confirmado. El repositorio principal se da cuenta de esto y lo git statusinforma en consecuencia:

modified: modules/media (untracked content)

Puede suprimir estos con:

[submodule "modules/media"]
   path = modules/media
   url = [email protected]:user/media.git
   ignore = dirty

Sin embargo, una vez que confirme esos cambios, el repositorio principal volverá a tomar nota y los informará en consecuencia:

modified:   modules/media (new commits)

Si desea suprimir estos también, debe ignorar los allcambios

[submodule "modules/media"]
   path = modules/media
   url = [email protected]:user/media.git
   ignore = all
aleemb
fuente
2
Para el .gitignorearchivo, hay una versión privada llamada exclude, ubicada en .git/info/, que no se maneja versión. ¿Existe un archivo correspondiente para el .gitmodulesarchivo que le permita suprimir los cambios en el submódulo solo en su instancia del repositorio principal, sin realizar cambios en .gitmodules?
HelloGoodbye
1
Hola, adiós: si marca .git / modules / $ MODULENAME / verá lo que parece ser el directorio .git para ese módulo. Cambiar el archivo de información / exclusión en esa ubicación hace el trabajo.
PaulW
1
La ignore = allparte es útil.
Eric Wang
53

Actualización: Vea (y vote a favor ) la respuesta de nilshaldenwang sobre la posibilidad de agregar al .gitmodulesarchivo un parámetro de configuración para ignorar el estado sucio de un submódulo dado.

ignore = dirty

Entonces git 1.7.2 está fuera e incluye la --ignore-submodulesopción para status.

De git help status:

--ignore-submodules [= <when>]
    Omita los cambios en los submódulos cuando busque cambios.
    <cuando> puede ser "sin seguimiento", "sucio" o "todo", que
    es el predeterminado Cuando se utiliza "sin seguimiento", los submódulos son
    no se considera sucio cuando solo contienen sin seguimiento
    contenido (pero aún se analizan en busca de contenido modificado).
    El uso de "sucio" ignora todos los cambios en el árbol de trabajo de
    submódulos, solo cambia a las confirmaciones almacenadas en el
    se muestran superproyectos (este era el comportamiento anterior
    1.7.0). El uso de "todos" oculta todos los cambios en los submódulos (y
    suprime la salida de resúmenes de submódulos cuando el
    La opción de configuración status.submodulesummary está configurada).

El valor que yo quiero es dirty.

git status --ignore-submodules=dirty

Uso un alias porque soy vago:

alias gst='git status --ignore-submodules=dirty'
kch
fuente
2
Dado que esta es una respuesta aceptada, creo que también debe agregar la opción de agregar ignore=dirtyentradas individuales en el .gitmodulesarchivo aquí.
Andriy Drozdyuk
14

Como mencionas, el submódulo parche git: ignora los submódulos sucios para el resumen y el estado está en proceso.

También anunciado en la versión Git 1.7.2-rc2 :

Git v1.7.2 Release Notes (draft)
================================

Updates since v1.7.1
--------------------

Opción " git status" aprendido " --ignore-submodules".

Sentido:

git config --global diff.ignoreSubmodules dirty

Considerar esto como una opción no es exactamente el enfoque elegido por ahora :

Después de esta serie, planeo agregar una opción de configuración ' ignore' .gitmodules, que se puede configurar para cada submódulo en "todos", "sucio", "sin seguimiento" o "ninguno" (el valor predeterminado).

" git diff" y " git status" usarán ese valor de configuración para cada submódulo.
El uso de " --ignore-submodule" anula este valor predeterminado (y el nuevo parámetro "none" se agregará allí para poder anular la configuración).

Y para evitar tener que hacer " git submdule sync" cada vez que cambie esa opción, me gustaría buscarla .git/configprimero.
Si no se encuentra allí, se tomará de .gitmodules, si está presente.

Por lo tanto, los usuarios pueden anular la configuración, pero si no lo hacen, el flujo ascendente puede cambiarlo fácilmente (por ejemplo, cuando un submódulo .gitignorese ha actualizado para que " ignore=untracked" ya no sea necesario, se puede eliminar).
Además, cambiar de rama tendrá un efecto instantáneo si la ignoreentrada ' ' .gitmoduleses diferente entre las ramas.


Otro enfoque para hacer que el estado de git (o cualquier comando de git) ignore un submódulo particular está disponible con Git 2.13 (Q2 2017):

git config submodule.<name>.active false

Ver más en " Ignorar nuevas confirmaciones para el submódulo git ".

VonC
fuente
Actualicé la pregunta con un poco de gitconfig. Solo haciendo ping en caso de que sepas la respuesta.
kch
@kch: He actualizado la respuesta con el enfoque actualmente propuesto para almacenar este tipo de configuración.
VonC
@drozzy: como mencionas en tu otro comentario: " ignore = dirty"
VonC
1
@drozzy: He votado y completado la respuesta de nilshaldenwang con el parámetro de configuración adicional "ignore = dirty", he editado la respuesta oficial, agregando un enlace a la publicación de nilshaldenwang.
VonC
Gracias, nada personal, ¡pero solo quería la respuesta más útil, que inicialmente me perdí!
Andriy Drozdyuk
11

También puedes usar

% git config [--global] submodule.ignore dirty

para establecer submodule.ignore = dirtyen su .git/configarchivo. --globalestablecerá la bandera de ignorar en su ~/.gitconfigy se aplicará a todos sus repositorios. Sin él, debería establecerse .git/configsolo para el repositorio en el que se encuentra actualmente.

La única documentación que puedo encontrar sobre esto está submodule.<name>.ignoreen los documentos de git-config . Lo moví de un archivo .gitmodules a mi ~ / .gitconfig y todavía funciona para mí.

kjell_
fuente
@ PawełGościcki Puedo confirmar que funciona en Git 2.0.0.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
6

Necesitas agregar

ignorar = sucio

a .gitmodules

romano
fuente
¿Dónde en .gitmodules lo agregas?
Andriy Drozdyuk
@drozzy Lo agrega en la sección para cada submódulo que desea ignorar, donde se definen los valores de "ruta" y "url".
jsdalton
2

Entonces git v1.7.2-rc2 tiene lo que quiero:

$ git diff --ignore-submodules = vendedor sucio
# ninguna salida
$ git status --ignore-submodules = vendedor sucio
# En la rama ...
nada que comprometer (directorio de trabajo limpio)

Construyendo tu propio git howto:

# get git
git clone git://git.kernel.org/pub/scm/git/git.git git
cd git
git checkout v1.7.2-rc2

# make git. beware of setting prefix
make configure
./configure --prefix=/usr/local
make
sudo make install

# you REALLY don't want to `make doc`, use this instead
sudo make quick-install-man
sudo make quick-install-html
kch
fuente
1
Cuento siete GITS aquí: git clone git://git.kernel.org/pub/scm/git/git.git git.
dotancohen
2

He respondido esta pregunta aquí con mayor detalle.

Solo corre

git config --global diff.ignoreSubmodules dirty

para agregar una opción de configuración local para ignorar esos cambios.

Devpool
fuente
1

Puede que no desee añadir ignore = dirtya .gitmodules, es posible que desee ser más selectivos acerca de los cambios que deseabas hacer caso.

Para hacer eso, agregue patrones a .git/submodule_foo/bar/info/exclude, donde submodule_foo/bar/está la ruta del submódulo.

Los patrones son similares a los patrones que agregaría .gitignore, siendo la raíz el directorio de submódulos. Por ejemplo, este patrón ignora el builddirectorio en el submódulo submodule_foo/bar/:

# in .git/submodule_foo/bar/info/exclude:
/build/
Flimm
fuente
3
Creo que esto ocultará los cambios también cuando esté dentro de un submódulo. Solo quiero que los cambios estén ocultos cuando esté fuera del submódulo. Está bien si aparecen cuando están adentro, cuando estoy trabajando activamente en el submódulo.
Raphael Schweikert