Wie filtere ich Git Diff basierend auf Dateierweiterungen?

151

Gibt es eine Option, um git diffauf einen bestimmten Satz von Dateierweiterungen zu beschränken ?

vfclists
quelle

Antworten:

226

Ja, wenn Sie sicherstellen, dass git einen Glob anstelle Ihrer Shell erweitert, stimmt er auf jeder Ebene überein, sodass so etwas (Anführungszeichen sind wichtig) gut funktionieren sollte.

git diff -- '*.c' '*.h'
CB Bailey
quelle
1
Ok, meine Git-Version war zu alt. Funktioniert wie in 1.7.8 angegeben. Ausgezeichnet.
Mat
3
Meins arbeitete mit Klammererweiterung, a lagit diff -- *.{c,h,etc}
Matt Fletcher
9
Der Doppelstrich ist wichtig, z. git diff master HEAD -- "*filename.txt"Ebenfalls nützlich ist diegit diff master HEAD --name-only
neaumusic
Die einfachen Anführungszeichen ( '') sind ebenfalls wichtig! git diff -- src/*.jssollte seingit diff -- 'src/*.js'
Nickofthyme
1
Muss dies auch im Stammverzeichnis des Git-Repositorys tun.
John Jiang
10

Um Dateien rekursiv (einschließlich des aktuellen Verzeichnisses) einzuschließen, funktionierte dies für mich:

git diff -- '***.py'
Bohumir Zamecnik
quelle
1
Für mich ist es die beste Lösung. Sie können auch einige Dateien / Verzeichnisse ausschließen. Zum Beispiel:git diff -- '***.py' ':!.Trashes'
Bartosz
Was machen die dreifachen Sternchen (im Vergleich zum einzelnen Sternchen)?
Jann Poppinga
IIRC bedeutet das doppelte Sternchen (möglicherweise) verschachtelte Verzeichnisse (sogar leer) und das einzelne Sternchen und .py bedeutet den Dateinamen. Es sollte sich also um eine * .py-Datei im aktuellen oder einem verschachtelten Verzeichnis handeln.
Bohumir Zamecnik
8

Verwenden Sie entweder den Globstar Ihrer Shell (der eine rekursive Suche durchführt) 1 , 2 :

shopt -s globstar 
git diff -- *.py **/*.py

oder benutze find:

find -name '*.py' -print0 | xargs -0 git diff --

Beide sind spezielle Namen und Leerzeichen. Obwohl Sie möglicherweise nach Verzeichnissen mit der Erweiterung .py filtern möchten :)


1 mache ich git diff -- {.,**}/*.pynormalerweise gerne

2 Wenn globstar aktiviert ist, git diff -- **/*.pyenthält es bereits ./*.py. In Bashs Manpage: 'Wenn ein / folgt, stimmen zwei benachbarte * nur mit Verzeichnissen und Unterverzeichnissen überein.'

sehe sehen
quelle
4

Bei einfachen Dateimustern scheint dies zu funktionieren:

$ git ls-files -zm '*.txt' | xargs --null git diff

Whitespace sicher, und Sie können auch mehrere Erweiterungen haben:

$ git ls-files -zm '*.h|*.c|*.cpp' | xargs --null git diff
Matte
quelle
3

Befehlszeilenargument für die Erweiterung.

git diff *.py

In der Alternative können Sie Rohr findin git diff:

find . -name '*.py' -type f | git diff --
hughdbrown
quelle
Bitte machen Sie die Antwort etwas lesbarer. Sie hätten mit git diff *.pyund ohne die schreienden Überschriften ausreichen können
siehe
1
Die 'Shout-Überschriften' waren # -Kommentare in einem Shell-Skript.
Hughdbrown
Dies ist die einzige Lösung, die für mich funktioniert hat. Die Anführungszeichen (usw.) funktionierten nicht an der Windows-Eingabeaufforderung.
Ed Bayiates
1

Wie in Git Version 2.18.0 getestet, sollte die Dateierweiterung in doppelte Anführungszeichen gesetzt werden. Wenn Sie nach dem Abrufen die letzten Unterschiede zwischen Ihrem lokalen und dem Remote-Repository ermitteln möchten, können Sie Folgendes verwenden:

git diff YourBranchName@{1} YourBranchName --name-only "*.YourFileExtionsion"

Beispielsweise:

git diff master@{1} origin/master --name-only "*.cs"
marjan.javid
quelle
1
Es funktionierte für mich, als ich - vor der Verlängerung, wie folgtgit diff master@{1} origin/master --name-only -- "*.cs"
333
0

Keine der obigen Antworten scheint unter git bashWindows für mich zu funktionieren . Ich bin nicht sicher, ob es sich um eine Versionssache (ich verwende 1.8.4) oder eine Windows / Bash-Sache handelt. In meinem Fall wollte ich auch zwei Zweige unterscheiden, in denen in jedem Zweig zusätzliche Dateien vorhanden waren, die im anderen Zweig nicht vorhanden waren (daher sind die auf "Suchen" basierenden Dateien nicht vorhanden).

Wie auch immer, das hat bei mir funktioniert (in meinem Beispiel nach einem Unterschied zwischen Python-Dateien):

git diff branch1 branch2 -- `git diff --summary branch1 branch2 | egrep '\.py$' | cut -d ' ' -f 5`
Yonatan
quelle
Dieser stackoverflow.com/a/8554987/4233229 funktioniert, aber man muss für Windows doppelte Anführungszeichen anstelle von einfachen verwenden
lcnittl
0

git diff zeigt nur Unterschiede in nicht bereitgestellten Dateien.

Ich habe diese Frage gefunden, weil ich .infoDateien von ausschließen wollte git diff. Ich habe dies erreicht, indem ich es mit inszeniert habe git add *.info, wodurch die verbleibenden Dateien reduziert werden.

Alan Whitelaw
quelle
0

Ich endete damit:

commit=<the_commit_hash_goes_here> && git diff --name-only $commit | grep -i Test | egrep -v '\.sql$' | xargs git diff $commit --

Dies zeigt Unterschiede für das angegebene Commit nur an, wenn der Dateiname das Wort 'test' enthält (ohne Berücksichtigung der Groß- und Kleinschreibung) und nicht mit endet .sql. Ändern Sie die Pipeline nach Bedarf für Ihren Fall.

MatrixManAtYrService
quelle