Schließen Sie ein Verzeichnis von git diff aus

179

Ich frage mich, wie ich ein ganzes Verzeichnis von meinem Git-Diff ausschließen kann. (In diesem Fall / Spezifikation). Ich erstelle ein Diff für unsere gesamte Softwareversion mit dem Befehl git diff. Die Änderungen an den Spezifikationen sind jedoch für dieses Verfahren irrelevant und verursachen nur Kopfschmerzen. Jetzt weiß ich, dass ich es kann

git diff previous_release..current_release app/

Dies würde einen Unterschied für alle Änderungen im App-Verzeichnis erzeugen, jedoch nicht zum Beispiel im lib / -Verzeichnis. Weiß jemand, wie man diese Aufgabe erfüllt? Vielen Dank!

Bearbeiten: Ich möchte nur klar sein, ich weiß, ich kann nur die Parameter aller meiner Verzeichnisse am Ende, minus / spec, aneinanderreihen. Ich hatte gehofft, dass es eine Möglichkeit gibt, ein einzelnes Verzeichnis im Befehl wirklich auszuschließen.

Mysrt
quelle
4
Ich fand diese erstaunliche Frage, weil ich Submodule ignorieren wollte . In diesem Fall kann diese Frage hilfreicher sein , wenn Sie so naiv sind wie ich .
Brandizzi
Das ist seltsam, dass wir noch keinen nativen Git-Switch dafür haben, der dies am Sep 2016 tut
Michael Z

Antworten:

138

Angenommen, Sie verwenden Bash und haben Extended Globbing ( shopt -s extglob) aktiviert , können Sie dies von der Shell-Seite aus handhaben:

git diff previous_release current_release !(spec)

Spart Ihnen das Auflisten aller anderen Dinge.

Oder schalenunabhängig:

git diff previous_release current_release --name-only | grep -v '^spec/' \
    | xargs git diff previous_release current_release --

Sie können dies in einem einzeiligen Shell-Skript zusammenfassen, um zu vermeiden, dass Sie die Argumente erneut eingeben müssen.

Cascabel
quelle
1
PS-Globbing stimmt nicht mit versteckten Dateien überein. Wenn Sie also besessen sind, möchten Sie möglicherweise .!(.|)alles abgleichen , beginnend mit einem .Neben .und ...
Cascabel
Dies scheint nicht für Dateien zu funktionieren, die brandneu sind oder branchenübergreifend gelöscht werden. Ich erhalte Fehler, die die Ausführung des Skripts stoppen und besagen, dass es sich nicht davon unterscheiden kann.
Graham Christensen
2
@ Abraham: Ich glaube, dass das, was --ich gerade hinzugefügt habe, das beheben sollte.
Cascabel
1
Tolle Antwort. Ich wollte nur Namen anzeigen (nicht den tatsächlichen Unterschied), also musste ich auch --name-onlyganz am Ende hinzufügen .
aug
1
Nachdem sie mit ihm herumspielen, möchte nur hinzufügen , dass , wenn Sie den Namen einer Datei ändern, wird es einen Fehler aus , aber alles , was Sie tun müssen, ist Add , -- path/of/new/fileund es wird es herausfinden :)
aug
318

Basierend auf dieser Antwort können Sie auch verwenden:

git diff previous_release..current_release -- . ':!spec'

Dies ist eine neue Git-Funktion, mit der bestimmte Pfade ausgeschlossen werden können. Es sollte zuverlässiger sein als verschiedene Shell-Oneliner.

Ich poste dies hier, weil diese Frage immer noch der Hit Nr. 1 für "git diff exclude path" ist.

cdleonard
quelle
4
Ich liebe diese Antwort. Wenn Sie Optionen hinzufügen, tun Sie dies vor dem Doppelstrich. ZB: git diff previous_release current_release --name-status -- . ':!spec'
Liamvictor
Ich wusste nicht, dass ich Filialnamen für das verwenden konnte current_releaseund brachte previous_releasemich zum Lächeln, als ich es herausfand.
trueheart78
2
Was für mich gearbeitet git diff --stat dev -- . ':!/Mopy/Docs/*'. Was für mich und Variationen nicht funktioniert hatgit diff dev --stat -- . ':!('Mopy/Docs/Wrye Bash General Readme.html'|'Mopy/Docs/Wrye Bash Advanced Readme.html')'
Mr_and_Mrs_D
Wirklich hilfreich. Hier ist die Syntax, um zu sehen, ob andere Dateien als database.yml geändert werden:git diff --check -- . ':!config/database.yml'
Dan Kohn
17
Kann auch mehrere Elemente wie git diff previous_release current_release -- . ':!file_a' ':!file_b'
folgt
36

Wenn Sie mehr als einen Pfad angeben möchten, der in einem Git-Diff ausgeschlossen werden soll, fügen Sie am Ende einfach zusätzliche Ausschlussparameter hinzu, z. B. um alles in Vendor- und Bin- Verzeichnissen von den Statistiken auszuschließen : -

git diff --stat previous_release..current_release -- . ':!vendor' ':!bin'
David Graham
quelle
33

Sie können versuchen, das diff-Attribut für alle Dateien im lib-Verzeichnis zu deaktivieren.
.gitattributes::

lib/* -diff

racl101 fügt in den Kommentaren hinzu :

Nur um dies hinzuzufügen, können Sie dies für diejenigen unter Ihnen hinzufügen, die die git diffAusgabe von Dateien eines bestimmten Typs in einem bestimmten Verzeichnis und seinen Unterverzeichnissen einschränken möchten , wie beispielsweise das gesamte JavaScript, das durch die Bündelung Ihrer .jsDateien durch Webpack generiert wird zu .gitattributes:

dist/js/**/*.js -diff

Dann sehen Sie nicht all das Rauschen in Ihrem Git-Diff-Ausgang und es zeigt nur Folgendes: Was Binary files ... differhilfreicher ist.

VonC
quelle
Dies würde jedoch die Spezifikation aus all meinen Unterschieden entfernen. Ich möchte meine Unterschiede immer noch normal im Spezifikationsordner sehen, nur nicht, wenn ich dieses '
Release'
2
@Mystr: Sie können diese .gitattributesDatei in einem speziellen Zweig festlegen, der nur für diese Art von 'Release'- current_releaseDiff erstellt wurde.
VonC
Auch dies scheint nicht für Dateien zu funktionieren, die über Zweige hinweg gelöscht werden. Dateien, die entfernt wurden, zeigen immer noch den vollständigen Unterschied.
Graham Christensen
Funktioniert bei mir nicht Sind _ Pfade etwas Besonderes? _site/* -diff
Marius
@MariusAndreiana Nein, '_' ist nichts Besonderes. Können Sie überprüfen, welche Gitattributes-Regel für eine Datei dieses Ordners gilt: git-scm.com/docs/git-check-attr
VonC
22

Git diff akzeptiert jetzt ein benutzerdefiniertes Ausschlussformat: git diff -- ':(exclude)lib/*'

Seien Sie vorsichtig, wenn Sie viele sich wiederholende Ordnernamen haben ('/ app', '/ lib' usw.), da dies Dateien relativ zum aktuellen Arbeitsverzeichnis UND zum Git-Stammverzeichnis ausschließt.

MaxPRafferty
quelle
1
Fehlt dir ein Punkt, sollte es nicht lieber sein git diff -- . ':(exclude)lib/*'?
Nicolas Dermine
1
@NicolasDermine Nein, obwohl das, was Sie geschrieben haben, gleichwertig ist. Der "Includes" -Teil des Pfads ist ebenfalls optional. Das ist der Grund, warum Sie einfach git diffalles für Ihren aktuellen Pfad tun können , anstatt es zu benötigengit diff -- .
MaxPRafferty
Hinweis: Verwenden Sie auf Windows-Computern doppelte Anführungszeichen, z. B.git diff -- ":(exclude)lib/*"
cnlevy
Keine Ahnung warum, aber für mich funktioniert es nur mit dem Punkt, wie von @NicolasDermine vorgeschlagen. Ich benutze Cmder auf win10.
Olivvv
3

Relativ zum Git-Stammverzeichnis

git diff akzeptiert einen optionalen Ausschluss

git diff -- ":(exclude)thingToExclude"

Möglicherweise möchten Sie einige Platzhalter hinzufügen

git diff -- ":(exclude)*/thingToExclude/*"

Zielspezifische Dateitypen

git diff -- ":(exclude)*/$1/*.png"

Etwas syntaktischer Zucker angewendet

git diff -- ":!/\$1/"

Oder legen Sie ein kleines Skript für Ihre Punktedateien ab

Wie .bash_profileoder.zshrc

gde() {
    : '
        git diff exclude files or folders
        usage:
        gde fileOrFolderNameToExclude
    '
    git diff -- ":!/\$1/"
}
jasonleonhard
quelle
-5
git diff app lib
Jed Schneider
quelle