2010-12-07 15 views
112

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

git diff previous_release..current_release app/ 

Die in dem App-Verzeichnis ein Diff für alle Änderungen schaffen würde tun können, aber nicht zum Beispiel im lib/Verzeichnis. Kann jemand diese Aufgabe erfüllen? Vielen Dank!

Edit: Ich möchte nur klar sein, ich weiß, ich kann nur die Parameter aller meiner Verzeichnisse am Ende, minus/spec. Ich hatte gehofft, dass es einen Weg gab, ein einzelnes Verzeichnis in dem Befehl wirklich auszuschließen.

+4

Ich fand diese erstaunliche Frage, weil ich _submodules_ ignorieren wollte. In diesem Fall, wenn Sie so naiv sind wie ich, kann [diese Frage] (http://stackoverflow.com/questions/3240881/) hilfreicher sein. – brandizzi

+0

Das ist merkwürdig, dass wir immer noch keinen nativen Git-Schalter haben, der dies im September 2016 macht. –

Antwort

103

Sie bash verwenden Angenommen, und Sie haben extglob aktiviert ist, könnten Sie das von der Mantelseite Griff:

git diff previous_release current_release !(spec) 

Sie alle anderen Dinge aufzulisten erspart.

Oder muschel Agnostiker:

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

Sie könnten, dass in einem Einzeiler Shell-Skript einpacken sparen Sie sich die Argumente erneut eingeben zu müssen.

+1

P.S. Globbing passt nicht zu versteckten Dateien. Wenn Sie also obsessiv sind, können Sie auf '.! (. |)' alles angleichen, was neben '.' und' ..' mit einem '.' – Cascabel

+0

Dies scheint nicht für Dateien zu funktionieren, die brandneu sind oder über mehrere Zweige hinweg gelöscht werden. Ich bekomme Fehler, die die Ausführung des Skripts anhalten und sagen, dass es nicht dagegen sein kann. –

+2

@Graham: Ich glaube, dass das '-' ich gerade hinzugefügt habe, sollte das beheben. – Cascabel

-5
git diff app lib 
20

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

lib/* -diff 
+0

das würde die Spezifikation von all meinen Diffs entfernen. Ich möchte immer noch meine Diffs im spec-Ordner sehen, nur nicht, wenn ich dieses 'release' -Verhalten starte. – Mysrt

+2

@Mystr: Du könntest das einstellen '.gitattributes 'file in einem speziellen Zweig, der nur für diese Art von 'release'-Diff erstellt wurde;) Stellen Sie diesen speziellen Zweig über' current_release' auf und führen Sie Ihren Diff von dort aus. – VonC

+0

Ah okay, danke, zwei gute Lösungen zu dieser Frage – Mysrt

199

Basierend auf this answer können Sie auch:

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

Dies ist eine neuere git-Funktion, die bestimmte Pfade ermöglicht auszuschließen. Es sollte zuverlässiger sein als verschiedene Shell-Oneliner.

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

+2

Liebe diese Antwort. Wenn Sie Optionen hinzufügen, tun Sie dies vor dem Doppelstrich. ZB: 'git diff vorherige_release aktuelle_release --name-status -. ':! spec'' – liamvictor

+0

Ich wusste nicht, dass ich Branchennamen für 'current_release' und' previous_release' verwenden könnte - brachte mich zum lächeln, als ich es herausfand. – trueheart78

+1

Was für mich funktionierte 'git diff --stat dev -. ':!/Mopy/Docs/*' '. Was hat _not_ für mich nicht funktioniert? Git diff dev --stat -. ':! (' Mopy/Docs/Wrye Bash Allgemein Readme.html '|' Mopy/Docs/Wrye Bash Fortgeschrittene Readme.html ')' 'und Variationen –

15

Wenn Sie mehr als einen auszuschließenden Pfad in einem Git-Diff angeben möchten, fügen Sie am Ende nur zusätzliche Ausschlussparameter hinzu, z. alles in Anbieter auszuschließen und bin Verzeichnisse aus den Statistiken: -

git diff --stat previous_release..current_release -- . ':!vendor' ':!bin' 
1

Git diff akzeptiert jetzt einen benutzerdefinierten Ausschluss Format: git diff -- ':(exclude)lib/*'

Seien Sie vorsichtig, wenn Sie eine Menge von sich wiederholenden Ordnernamen haben ('/ app', '/ lib', usw.), da dies Dateien relativ zum aktuellen Arbeitsverzeichnis und zum git root-Verzeichnis ausschließt.

+0

fehlt dir ein Punkt, sollte es nicht 'git diff- sein. ': (ausschließen) lib/*' '? –