Git: Kann ich die Auflistung von 'modifizierten Inhalten' / schmutzigen Submoduleinträgen in Status, Diff usw. unterdrücken?


123

Irgendwann (ich glaube um die 1.6.x-Versionen herum) wurde git auf Änderungen in Submodulen aufmerksam. Das nervt mich nur:

$ git status vendor | grep geändert:
# geändert: Hersteller / Schienen (geänderter Inhalt)
$ git diff vendor /
diff --git a / vendor / Rails b / Vendor / Rails
--- a / Verkäufer / Schienen
+++ b / Anbieter / Schienen
@@ -1 +1 @@
-Subprojekt Commit 046c900df27994d454b7f906caa0e4226bb42b6f
+ Subprojekt Commit 046c900df27994d454b7f906caa0e4226bb42b6f-schmutzig

Bitte lass es aufhören?

Bearbeiten:

Ok, also ich habe eine Antwort. Jetzt habe ich noch eine Frage:

Kann ich das einfügen ~/.gitconfig? Von Anfang an scheint es, dass ich nicht kann, und ich habe nichts vielversprechendes gesehen, als ich den Patch überflogen habe. (Ich denke, ich kann immer noch einen Alias ​​erstellen.)


Ich sehe einige Patches in der Git-Mailingliste, die sich auf Juni 2010 beziehen. Hoffentlich ist es in einer kommenden Veröffentlichung. (Google für 'git "--ignore-submodules = dirty"')
kch

+1 für die Erklärung, warum die Nachricht auftritt!
Dotancohen

Antworten:


175

Es besteht sogar die Möglichkeit, den Ignoriermodus für jedes hinzugefügte Submodul in der .gitmodules-Datei festzulegen.

Erst heute bin ich auf dieses Problem gestoßen und habe sofort einen Artikel in meinem Blog darüber geschrieben, nachdem ich eine Lösung gefunden hatte: Wie man Änderungen in Git-Submodulen ignoriert

Das Wesentliche davon:

Sobald Sie ein Submodul hinzugefügt haben, wird .gitmodulesim Stammverzeichnis Ihres Repositorys eine Datei mit dem Namen angezeigt

Fügen Sie dieser .gitmodulesDatei einfach eine Zeile hinzu :

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

5
+1, aber ich habe den Hauptteil Ihres Blogposts in Ihre Antwort auf SO aufgenommen: Ihr externer Link kann eines Tages ungültig werden, im Gegensatz zu SO-Antworten, die für immer leben werden (über SO-Dumps: blog.stackoverflow.com/2009/). 06 /… )
VonC

5
Ich stellte fest, dass ich die .gitmodules-Datei festschreiben musste, bevor ich git statuswie erwartet funktionierte. Außerdem brauchst du mindestens 1.7.4 oder besser, glaube ich.
Aleemb

Für die .gitignoreDatei gibt es eine private Version namens exclude, die sich in .git/info/befindet und nicht versioniert ist. Gibt es eine entsprechende Datei für die .gitmodulesDatei, mit der Sie Änderungen im Submodul nur in Ihrer Instanz des übergeordneten Repositorys unterdrücken können, ohne Änderungen daran vorzunehmen .gitmodules?
HelloGoodbye

2
Ich kann dies nicht mit einem Submodul zum Verfolgen eines Zweigs zum Laufen bringen. Wird es dafür nicht unterstützt? `` `[Submodul" smstack / ansible / hosts "] path = smstack / ansible / hosts url = https: // ... branch = master ignore = schmutzig` `` ``
Marc Abramowitz

1
@MarcAbramowitz Ich bin auf dasselbe Problem gestoßen, das ich denke - haben Sie eine Lösung dafür gefunden?
Sebastian G. Marinescu

61

Es gibt zwei Arten von Änderungsbenachrichtigungen, die Sie unterdrücken können.

Das erste ist, untracked contentwas passiert, wenn Sie Änderungen an Ihrem Submodul vornehmen, diese aber noch nicht festgeschrieben haben. Das übergeordnete Repository bemerkt dies und git statusmeldet es entsprechend:

modified: modules/media (untracked content)

Sie können diese unterdrücken mit:

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

Sobald Sie diese Änderungen festschreiben, nimmt das übergeordnete Repository dies erneut zur Kenntnis und meldet sie entsprechend:

modified:   modules/media (new commits)

Wenn Sie diese ebenfalls unterdrücken möchten, müssen Sie allÄnderungen ignorieren

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

2
Für die .gitignoreDatei gibt es eine private Version namens exclude, die sich in .git/info/befindet und nicht versioniert ist. Gibt es eine entsprechende Datei für die .gitmodulesDatei, mit der Sie Änderungen im Submodul nur in Ihrer Instanz des übergeordneten Repositorys unterdrücken können, ohne Änderungen daran vorzunehmen .gitmodules?
HelloGoodbye

1
HelloGoodbye: Wenn Sie .git / modules / $ MODULENAME / aktivieren, sehen Sie, was das .git-Verzeichnis für dieses Modul zu sein scheint. Das Ändern der Info- / Ausschlussdatei an diesem Speicherort erledigt den Job.
PaulW

1
Der ignore = allTeil ist nützlich.
Eric Wang

53

Update: Siehe (und positiv) die Antwort von nilshaldenwang bezüglich der Möglichkeit, der Datei einen Konfigurationsparameter hinzuzufügen, um den fehlerhaften Zustand eines bestimmten Submoduls zu ignorieren..gitmodules

ignore = dirty

Also ist Git 1.7.2 raus und beinhaltet die --ignore-submodulesOption für status.

Von git help status:

--ignore-submodules [= <wenn>]
    Ignorieren Sie Änderungen an Submodulen, wenn Sie nach Änderungen suchen.
    <wenn> kann entweder "nicht verfolgt", "schmutzig" oder "alle" sein, was
    ist die Standardeinstellung. Bei Verwendung von "untracked" werden Submodule verwendet
    gilt nicht als schmutzig, wenn sie nur untracked enthalten
    Inhalt (aber sie werden immer noch nach geändertem Inhalt durchsucht).
    Bei Verwendung von "schmutzig" werden alle Änderungen am Arbeitsbaum von ignoriert
    Submodule, ändert nur die in der
    Superprojekt werden angezeigt (dies war das Verhalten zuvor
    1.7.0). Die Verwendung von "all" verbirgt alle Änderungen an Submodulen (und
    unterdrückt die Ausgabe von Submodul-Zusammenfassungen, wenn die
    Konfigurationsoption status.submodulesummary ist gesetzt).

Der Wert, den ich will, ist dirty.

git status --ignore-submodules=dirty

Ich benutze einen Alias, weil ich faul bin:

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

2
Da dies eine akzeptierte Antwort ist, sollten Sie hier auch die Option hinzufügen ignore=dirty, einzelne Einträge in der .gitmodulesDatei hinzuzufügen .
Andriy Drozdyuk

14

Wie Sie bereits erwähnt haben, ist das Patch- Git-Submodul: Ignorieren Sie schmutzige Submodule, um eine Zusammenfassung und einen Status zu erhalten.

Ebenfalls angekündigt in der Version Git 1.7.2-rc2 :

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

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

Option " git status" gelernt " --ignore-submodules".

Bedeutung:

git config --global diff.ignoreSubmodules dirty

Dies als Option zu betrachten, ist derzeit nicht genau der gewählte Ansatz :

Nach dieser Serie plane ich, eine Konfigurationsoption ' ignore' hinzuzufügen .gitmodules, die für jedes Submodul entweder auf "alle", "schmutzig", "nicht verfolgt" oder "keine" (Standardeinstellung) eingestellt werden kann.

" git diff" und " git status" verwenden diesen Konfigurationswert für jedes Submodul.
Die Verwendung von " --ignore-submodule" überschreibt diesen Standard (und der neue Parameter "none" wird dort hinzugefügt, um die Konfigurationseinstellungen überschreiben zu können).

Und um zu vermeiden, dass Sie git submdule syncjedes Mal " " tun müssen, wenn sich diese Option ändert, möchte ich zuerst danach suchen .git/config.
Wird es dort nicht gefunden, wird es .gitmodules, falls vorhanden , entnommen .

Benutzer können die Einstellung also überschreiben, aber wenn dies nicht der Fall ist, kann Upstream sie leicht ändern (z. B. wenn ein Submodul .gitignoreaktualisiert wurde, sodass " ignore=untracked" nicht mehr erforderlich ist, kann es entfernt werden).
Auch das Wechseln von Zweigen wirkt sich sofort aus, wenn der ignoreEintrag in den .gitmodulesZweigen unterschiedlich ist.


Ein anderer Ansatz, um den Git-Status (oder einen beliebigen Git-Befehl) zum Ignorieren eines bestimmten Submoduls festzulegen, ist mit Git 2.13 (Q2 2017) verfügbar:

git config submodule.<name>.active false

Weitere Informationen finden Sie unter " Neue Commits für Git-Submodul ignorieren ".


Ich habe die Frage mit einem gitconfig-Bit aktualisiert. Pingen Sie einfach, falls Sie die Antwort kennen.
Kch

@kch: Ich habe die Antwort mit dem derzeit vorgeschlagenen Ansatz zum Speichern dieser Art von Einstellung aktualisiert.
VonC

@drozzy: wie Sie in Ihrem anderen Kommentar erwähnen: " ignore = dirty"
VonC

1
@drozzy: Ich habe die Antwort von nilshaldenwang mit dem zusätzlichen Konfigurationsparameter "ignore = schmutzig" bewertet und vervollständigt. Ich habe die offizielle Antwort bearbeitet und einen Link zu nilshaldenwangs Beitrag hinzugefügt.
VonC

Danke, nichts Persönliches, aber ich wollte nur die nützlichere Antwort oben, die ich anfangs verpasst habe!
Andriy Drozdyuk

11

Sie können auch verwenden

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

submodule.ignore = dirtyin Ihrer .git/configDatei einstellen . --globalsetzt das Ignorier-Flag in Ihrem ~/.gitconfigund gilt für alle Ihre Repositorys. Ohne sie sollte es .git/confignur für das Repo eingesetzt werden, in dem Sie sich gerade befinden.

Die einzige Dokumentation, die ich dazu finden kann, ist submodule.<name>.ignorein den git-config-Dokumenten . Ich habe es aus einer .gitmodules-Datei in meine ~ / .gitconfig verschoben und es funktioniert immer noch für mich.


@ PawełGościcki Ich kann bestätigen, dass es auf Git 2.0.0 funktioniert.
Ciro Santilli 法轮功 冠状 病 六四 事件 1

6

Sie müssen hinzufügen

ignorieren = schmutzig

zu .gitmodules


Wo in .gitmodules fügen Sie es hinzu?
Andriy Drozdyuk

@drozzy Sie fügen es unter dem Abschnitt für jedes Submodul hinzu, das Sie ignorieren möchten, in dem die Werte "Pfad" und "URL" definiert sind.
Jsdalton

2

Git v1.7.2-rc2 hat also was ich will:

$ git diff --ignore-submodules = schmutziger Anbieter
# keine Leistung
$ git status --ignore-submodules = schmutziger Anbieter
# Auf Zweig…
nichts festzuschreiben (Arbeitsverzeichnis sauber)

Erstellen Sie Ihr eigenes 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
Ich zähle hier sieben Gits : git clone git://git.kernel.org/pub/scm/git/git.git git.
Dotancohen

2

Ich habe diese Frage hier ausführlicher beantwortet .

Renn einfach

git config --global diff.ignoreSubmodules dirty

um eine lokale Konfigurationsoption hinzuzufügen, um diese Änderungen zu ignorieren.


1

Möglicherweise möchten Sie nicht hinzufügen ignore = dirtyzu .gitmoduleskönnen Sie selektiver über die Veränderungen sein wollen Sie ignorieren wollte.

Fügen Sie dazu Muster hinzu .git/submodule_foo/bar/info/exclude, wo submodule_foo/bar/sich der Pfad des Submoduls befindet.

Die Muster ähneln den Mustern, die Sie hinzufügen würden .gitignore, wobei das Stammverzeichnis das Submodulverzeichnis ist. Dieses Muster ignoriert beispielsweise das buildVerzeichnis im Submodul submodule_foo/bar/:

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

3
Ich denke, dies wird die Änderungen auch in einem Submodul verbergen. Ich möchte die Änderungen nur außerhalb des Submoduls verbergen. Es ist in Ordnung, wenn sie im Inneren auftauchen, wenn ich aktiv am Submodul arbeite.
Raphael Schweikert
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.