Git: posso sopprimere l'elenco di voci di 'contenuto modificato' / sottomodulo sporco in status, diff, ecc.?


123

Qualche volta (intorno alle versioni 1.6.x, credo) git è venuto a conoscenza dei cambiamenti all'interno dei sottomoduli. Serve solo a darmi fastidio:

$ git status venditore | grep modificato:
# modified: vendor / rails (contenuto modificato)
$ git diff venditore /
diff --git a / vendor / rails b / vendor / rails
--- a / vendor / rails
+++ b / venditore / rotaie
@@ -1 +1 @@
-Subproject commit 046c900df27994d454b7f906caa0e4226bb42b6f
+ Commit del sottoprogetto 046c900df27994d454b7f906caa0e4226bb42b6f-dirty

Per favore, fallo smettere?

Modificare:

Ok, quindi ho una risposta. Ora ho un'altra domanda:

Posso metterlo ~/.gitconfig? Dalle mie iniziali sembra che non posso, e non ho visto nulla di promettente sfiorando il cerotto. (Immagino di poter ancora creare un alias.)


Vedo alcune patch nella mailing list git riguardo a questo, risalente a giugno 2010. Quindi spero che sia in una prossima versione. (google per "git" --ignore-submodules = dirty "')
kch

+1 per aver spiegato perché si verifica il messaggio!
dotancohen

Risposte:


175

C'è anche la possibilità di impostare la modalità ignora per ogni sottomodulo aggiunto all'interno del file .gitmodules.

Proprio oggi ho riscontrato questo problema e ho subito scritto un articolo nel mio blog dopo aver trovato una soluzione: Come ignorare le modifiche nei sottomoduli git

Il succo di tutto:

Una volta aggiunto un sottomodulo, ci sarà un file denominato .gitmodulesnella radice del tuo repository

Basta aggiungere una riga a quel .gitmodulesfile:

[submodule "bundle/fugitive"]
    path = bundle/fugitive
    url = git://github.com/tpope/vim-fugitive.git
    ignore = dirty

5
+1, ma ho incluso la parte principale del tuo post sul blog alla tua risposta su SO: il tuo link esterno può diventare non valido un giorno, a differenza delle risposte SO che vivranno per sempre (tramite SO dump: blog.stackoverflow.com/2009/ 06 /… )
VonC

5
Ho scoperto che avevo bisogno di eseguire il commit del file .gitmodules prima che git statusfunzionasse come previsto. Inoltre è necessario almeno 1.7.4 o meglio credo.
Aleemb

Per il .gitignorefile, esiste una versione privata chiamata exclude, situata in .git/info/, che non è la versione gestita. Esiste un file corrispondente per il .gitmodulesfile che ti consentirà di sopprimere le modifiche nel sottomodulo solo nella tua istanza del repository genitore, senza apportare modifiche a .gitmodules?
HelloGoodbye

2
Non riesco a farlo funzionare con un sottomodulo che traccia un ramo. Non è supportato per questo? `` `[sottomodulo" smstack / ansible / hosts "] path = smstack / ansible / hosts url = https: // ... branch = master ignore = dirty` `` `` `
Marc Abramowitz

1
@MarcAbramowitz Mi sono imbattuto nello stesso problema, penso: hai trovato qualche soluzione a questo?
Sebastian G. Marinescu

61

Esistono due tipi di notifiche di modifica che è possibile sopprimere.

Il primo è untracked contentche accade quando apporti modifiche al tuo sottomodulo ma non le hai ancora salvate. Il repository genitore li nota e lo git statussegnala di conseguenza:

modified: modules/media (untracked content)

Puoi sopprimerli con:

[submodule "modules/media"]
   path = modules/media
   url = git@github.com:user/media.git
   ignore = dirty

Tuttavia, una volta che hai eseguito il commit di tali modifiche, il repository principale ne prenderà nuovamente atto e le segnalerà di conseguenza:

modified:   modules/media (new commits)

Se vuoi sopprimere anche questi, devi ignorare le allmodifiche

[submodule "modules/media"]
   path = modules/media
   url = git@github.com:user/media.git
   ignore = all

2
Per il .gitignorefile, esiste una versione privata chiamata exclude, situata in .git/info/, che non è la versione gestita. Esiste un file corrispondente per il .gitmodulesfile che ti consentirà di sopprimere le modifiche nel sottomodulo solo nella tua istanza del repository genitore, senza apportare modifiche a .gitmodules?
HelloGoodbye

1
HelloGoodbye: Se controlli .git / modules / $ MODULENAME / vedrai quella che sembra essere la directory .git per quel modulo. La modifica del file info / esclusione in quella posizione fa il lavoro.
PaulW

1
La ignore = allparte è utile.
Eric Wang

53

Aggiornamento: vedere (e votare a favore ) la risposta di nilshaldenwang riguardo alla possibilità di aggiungere al .gitmodulesfile un parametro di configurazione per ignorare lo stato sporco di un dato sottomodulo.

ignore = dirty

Quindi git 1.7.2 è disponibile e include l' --ignore-submodulesopzione per status.

Da git help status:

--ignore-sottomoduli [= <quando>]
    Ignora le modifiche ai sottomoduli durante la ricerca di modifiche.
    <when> può essere "untracked", "dirty" o "all", che
    è l'impostazione predefinita. Quando si usa "untracked" i sottomoduli sono
    non considerato sporco quando contengono solo untracked
    contenuto (ma vengono ancora analizzati per il contenuto modificato).
    L'utilizzo di "dirty" ignora tutte le modifiche all'albero di lavoro di
    sottomoduli, solo le modifiche ai commit memorizzati nel file
    vengono mostrati i superprogetti (questo era il comportamento prima
    1.7.0). L'uso di "all" nasconde tutte le modifiche ai sottomoduli (e
    sopprime l'output dei riepiloghi dei sottomoduli quando il
    l'opzione di configurazione status.submodulesummary è impostata).

Il valore che voglio è dirty.

git status --ignore-submodules=dirty

Uso un alias perché sono pigro:

alias gst='git status --ignore-submodules=dirty'

2
Poiché questa è una risposta accettata, penso che dovresti anche aggiungere l'opzione di aggiunta ignore=dirtyalle singole voci nel .gitmodulesfile qui.
Andriy Drozdyuk

14

Come hai detto, il sottomodulo git della patch : ignora i sottomoduli sporchi per il riepilogo e lo stato è in preparazione.

Annunciato anche nella versione Git 1.7.2-rc2 :

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

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

Opzione " git status" appreso " --ignore-submodules".

Senso:

git config --global diff.ignoreSubmodules dirty

Considerare questa un'opzione non è esattamente l' approccio scelto per ora :

Dopo questa serie ho intenzione di aggiungere un'opzione di configurazione " ignore" .gitmodules, che può essere impostata per ogni sottomodulo su "all", "dirty", "untracked" o "none" (impostazione predefinita).

" git diff" e " git status" useranno quel valore di configurazione per ogni sottomodulo.
L'uso di " --ignore-submodule" sovrascrive questo valore predefinito (e il nuovo parametro "nessuno" verrà aggiunto lì per poter sovrascrivere le impostazioni di configurazione).

E per evitare di dover fare " git submdule sync" ogni volta che l'opzione cambia, vorrei cercarla .git/configprima.
Se non si trova lì, verrà preso da .gitmodules, se presente.

Quindi gli utenti possono sovrascrivere l'impostazione, ma se non lo fanno, l'upstream può cambiarla facilmente (ad esempio, quando un sottomodulo .gitignoreè stato aggiornato in modo che " ignore=untracked" non sia più necessario può essere rimosso).
Anche il cambio di ramo avrà un effetto istantaneo se la ignorevoce " " in .gitmodulesè diversa tra i rami.


Un altro approccio per fare in modo che git status (o qualsiasi comando git) ignori un particolare sottomodulo è disponibile con Git 2.13 (Q2 2017):

git config submodule.<name>.active false

Per ulteriori informazioni, vedere " Ignora nuovi commit per il sottomodulo git ".


Ho aggiornato la domanda con un bit gitconfig. Solo ping nel caso in cui conosci la risposta.
kch

@kch: ho aggiornato la risposta con l'approccio attualmente proposto per memorizzare questo tipo di impostazione.
VonC

@drozzy: come hai menzionato nell'altro tuo commento: " ignore = dirty"
VonC

1
@drozzy: ho votato verso l'alto e completato la risposta di nilshaldenwang con il parametro di configurazione aggiuntivo "ignore = dirty", ho modificato la risposta ufficiale, aggiungendo un collegamento al post di nilshaldenwang.
VonC

Grazie, niente di personale, ma volevo solo la risposta più utile in alto, che inizialmente mi mancava!
Andriy Drozdyuk

11

Puoi anche usare

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

da impostare submodule.ignore = dirtynel .git/configfile. --globalimposterà il flag ignora nel tuo ~/.gitconfige si applicherà a tutti i tuoi repository. Senza di esso dovrebbe essere impostato .git/configsolo per il repo in cui ti trovi attualmente.

L'unica documentazione che posso trovare su questo è submodule.<name>.ignorenei documenti git-config . L'ho spostato da un file .gitmodules nel mio ~ / .gitconfig e per me funziona ancora.


@ PawełGościcki Posso confermare che funziona su Git 2.0.0.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

6

Devi aggiungere

ignora = sporco

a .gitmodules


Dove lo aggiungi nei .gitmodules?
Andriy Drozdyuk

@drozzy Lo aggiungi nella sezione per ogni sottomodulo che vuoi ignorare, dove sono definiti i valori "path" e "url".
jsdalton

2

Quindi git v1.7.2-rc2 ha quello che voglio:

$ git diff --ignore-submodules = venditore sporco
# nessun output
$ git status --ignore-submodules = venditore sporco
# Sul ramo ...
niente da impegnare (directory di lavoro pulita)

Costruire il proprio 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

1
Conto Gits sette qui: git clone git://git.kernel.org/pub/scm/git/git.git git.
dotancohen

2

Ho risposto a questa domanda qui in maggiore dettaglio.

Corri

git config --global diff.ignoreSubmodules dirty

per aggiungere un'opzione di configurazione locale per ignorare tali modifiche.


1

Potresti non voler aggiungere ignore = dirtya .gitmodules, potresti voler essere più selettivo riguardo alle modifiche che desideri ignorare.

Per fare ciò, aggiungi modelli a .git/submodule_foo/bar/info/exclude, dov'è submodule_foo/bar/il percorso del sottomodulo.

I modelli sono simili ai modelli a cui aggiungeresti .gitignore, con la radice che è la directory del sottomodulo. Ad esempio, questo modello ignora la builddirectory nel sottomodulo submodule_foo/bar/:

# in .git/submodule_foo/bar/info/exclude:
/build/

3
Penso che questo nasconderà le modifiche anche all'interno di un sottomodulo. Voglio solo le modifiche nascoste quando fuori dal sottomodulo. Va bene se si presentano quando sono dentro, quando sto lavorando attivamente al sottomodulo.
Raphael Schweikert
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.