Möchten Sie eine Datei von "git diff" ausschließen?

227

Ich versuche, eine Datei ( db/irrelevant.php) von einem Git-Diff auszuschließen . Ich habe versucht, eine Datei in das mit der Zeile dbaufgerufene Unterverzeichnis einzufügen .gitattributes, irrelevant.php -diff und ich habe auch versucht, eine Datei mit dem Namen .git/info/attributesenthaltend zu erstellen db/irrelevant.php.

In allen Fällen ist die db/irrelevant.phpDatei als Git-Binär-Patch im Diff enthalten. Ich möchte, dass die Änderungen an dieser Datei vom Befehl diff ignoriert werden. Was mache ich falsch?

Michael
quelle

Antworten:

323

Omg, Treiber und awk, um eine miese Datei auszuschließen? Seit Git 1.9 können Sie etwas :

git diff -- . ':(exclude)db/irrelevant.php' ':(exclude)db/irrelevant2.php'

Ah, Eleganz! Siehe die zitierte Antwort und für Details diese Antwort von @torek

Mr_and_Mrs_D
quelle
3
HINWEIS: Wenn Sie einen bestimmten Dateinamen ausschließen möchten, müssen Sie ein Sternchen voranstellen, das sich von der .gitignoreDateisyntax unterscheidet. ZB :!*shrinkwrap.yamlstatt :!shrinkwrap.yaml.
Vaughan
7
Schließen Sie weitere Dateien aus, z. B. habe ich * .min.css- und * .min.js-Dateien, um sie aus dem Git-Diff zu vermeiden. Also benutze ich den Befehlgit diff -- . ':(exclude)*.min.js' ':(exclude)*.min.css'
Maheshwaghmare
4
Windows-Syntax : git diff -- . ":(exclude)db/irrelevant.php"(doppelte Anführungszeichen anstelle von einfachen Anführungszeichen)
cnlevy
4
Danke dir! Solch eine esoterische Syntax. Ich muss sie jedes Mal nachschlagen.
Daniel Waltrip
1
@nlevy oder keine Zitate! git diff -- . :(exclude)db/irrelevant.php
Matthias
62

Sie können einen benutzerdefinierten Diff-Treiber mit dem Befehl no op einrichten und ihn den Dateien zuweisen, die ignoriert werden sollen.

Erstellen Sie mit diesem Befehl einen repository-spezifischen Diff-Treiber

git config diff.nodiff.command /bin/true

oder für alle deine Repos mit --global.

(Wenn /bin/truein MacOS nicht vorhanden, werden Alternativen verwendet /usr/bin/trueoder echo).

Weisen Sie dann den neuen Diff-Treiber den Dateien zu, die in Ihrer .git/info/attributesDatei ignoriert werden sollen.

irrelevant.php    diff=nodiff

Wenn dieser Status mit anderen Entwicklern geteilt werden soll, können Sie den Befehl .gitattributesanstelle von verwenden .git/info/attributesund git configmit Ihren Kollegen teilen (über eine Dokumentationsdatei oder etwas anderes ).

KurzedMetal
quelle
2
Dies ist genau das, wonach ich gesucht habe - wie unter kerneltrap.org/mailarchive/git/2008/10/17/3711254 beschrieben. Ich habe ~ / .gitconfig bearbeitet und Folgendes hinzugefügt: [diff "nodiff"] `command = / bin / true` und dann eine Datei mit dem Namen erstellt .git / info / Attribute, zu denen ich hinzugefügt habe: irrelevant.php diff=nodiff
Michael
12
Diese Antwort funktionierte viel besser für mich: stackoverflow.com/questions/1016798/…
Neil Forrester
3
Interessanterweise funktioniert dieser Ansatz nicht git diff --stat. In diesem Fall könnte man git diff ... | diffstatals Workaround verwenden.
ddkilzer
@ Michael, dieser Link scheint verfälscht zu sein, gibt es noch einen?
DickieBoy
3
Nur eine Ergänzung: Wenn Sie Git Diff zwingen möchten, es trotzdem anzuzeigen, verwenden Sie--no-ext-diff
Florian Klein
35

Sie können auch das filterdiff- Programm der Patchutils- Programmsammlung verwenden, um einige Teile eines Diff auszuschließen. Beispielsweise:

git diff | filterdiff -p 1 -x db/irrelevant.php
Szilárd Pfeiffer
quelle
4
Beachten Sie, dass -pauf der Manpage (1) "-pn, --strip-match = n lautet. Ignorieren Sie beim Abgleich die ersten n Komponenten des Pfadnamens." Es dauerte eine Weile, bis ich herausfand, -p 1dass das dbTeil aus dem Weg des OP entfernt wurde. Wenn Sie nur einen Dateinamen angeben und alle Pfad- / Verzeichnismöglichkeiten ignorieren möchten, können Sie verwenden -p 99.
Tyler Collier
32

Diese Methode ist kürzer als die akzeptierten Antworten.

git diff 987200fbfb 878cee40ba --stat -- ':!*.cs'

Weitere Informationen zu den verschiedenen Einschluss- / Ausschlussmöglichkeiten finden Sie in diesem anderen Beitrag

Chiel ten Brinke
quelle
Beachten Sie, dass der Filter nur für alle Dateien unter Ihrem aktuellen Verzeichnis gilt.
Chiel ten Brinke
Dies war die beste Antwort. Ich konnte es ein bisschen mehr vereinfachen: stackoverflow.com/a/58845608/3886183
dlsso
2
Ich würde den Teil --stat entfernen oder zumindest erklären, was er tut, da keine der anderen Antworten ihn enthält.
mix3d
Das Statistik-Flag zeigt Ihnen die Dateien und ihre unterschiedlichen Summen an, sodass Sie leicht überprüfen können, ob der Filter wie beabsichtigt funktioniert hat.
Chiel ten Brinke
17

Diese einzeilige Lösung erfordert keine weiteren Dienstprogramme / Downloads:

git diff `git status -s |grep -v ^\ D |grep -v file/to/exclude.txt |cut -b4-`

Wo file/to/exclude.txtist der Name der Datei, die Sie natürlich ausschließen möchten?

Bearbeiten: credit ksenzee zum Beheben gelöschter Dateien, die den Diff brechen.

Ben Roux
quelle
Ich versuche, Ihren Einzeiler git diff --stat masterohne großen Erfolg anzupassen - könnten Sie helfen?
Mr_and_Mrs_D
13

Wirklich gute Antwort von KurzedMetal für das, was ich tun musste, nämlich die Fähigkeit zu sehen, dass sich die Datei geändert hat, aber nicht den Unterschied zu erzeugen, der in meinem Fall riesig gewesen sein könnte.

Aber ein Kollege von mir schlug einen Ansatz vor, der noch einfacher war und für mich funktionierte:

Hinzufügen einer .gitattributesDatei in dem Verzeichnis, in dem sich die zu ignorierende Datei git diffmit folgendem Inhalt befindet:

file-not-to-diff.bin -diff

Das lässt immer noch git status"sehen", ob sich die Datei geändert hat. git diffwird auch "sehen", dass sich die Datei geändert hat, aber es wird nicht die generiert diff.

Diese .binErweiterung für die Datei im Beispiel war absichtlich. Mir ist klar, dass dies das Standardverhalten von git für Binärdateien ist und keine spezielle Behandlung mit erforderlich ist .gitattributes. Aber in meinem Fall wurden diese Dateien von git und dem Dienstprogramm "file" als Textdateien erkannt, und dies hat den Trick getan.

user3589608
quelle
11

Einfachste Antwort

git diff ':!db/irrelevant.php'

Es ist direkt ':!<path to file>'nach Ihrem Diff-Befehl. Der Befehl diff kann so kompliziert sein, wie *.min.jsSie möchten , und Sie können Platzhalter wie oder mehrere Ausschlüsse hinzufügen (Leerzeichen trennen die zitierten Blöcke), wenn Sie möchten.

dlsso
quelle
5

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"

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 -- ":(exclude)*/$1/*"
}
jasonleonhard
quelle
Das funktioniert bei mir einfach nicht, ich bekomme überhaupt keinen Unterschied, mit beiden Syntaxen, mit (ausschließen) oder! Ich habe Git 2.21.0
Olivvv
Sie können diff entweder nicht bereitgestellte oder bereitgestellte Dateien git. Wenn Sie Git hinzugefügt haben, werden sie inszeniert. Wenn sie inszeniert sind, können Sie git diff --stagedhoffen, dass dies Ihnen hilft.
Jasonleonhard
Was macht der Doppelpunkt syntaktisch?
Jonah
2

Es ist sehr einfach, Sie können mit Standard-Unix-Befehlen ausschließen, was Sie wollen. Diese Befehle sind unter Git Bash sogar unter Windows verfügbar. Das folgende Beispiel zeigt, wie Sie diff für pom.xml-Dateien ausschließen. Überprüfen Sie zuerst diff to master nur für Dateinamen, verwenden Sie dann 'grep -v', um Dateien auszuschließen, die Sie nicht möchten, und führen Sie dann diff to master mit der vorab festgelegten Liste erneut aus:

git diff master `git diff --name-only master | grep -v pom.xml`
Nieznany Anonimiec
quelle
1

ähnlich der Lösung von Ben Roux , aber trotzdem teilen:

git status --porcelain | grep -v $PATTERN_TO_EXCLUDE | awk '{print $2}' | xargs git diff

oder wenn die Änderungen bereits lokal festgeschrieben wurden:

git diff --name-only origin/master | grep -v $PATTERN_TO_EXCLUDE | xargs git diff origin/master

Beispiele:

git status --porcelain | grep -v docs | awk '{print $2}' | xargs git diff origin/master

git diff --name-only origin/master | grep -v docs | xargs git diff origin/master
Chris Montoro
quelle
1

Ich mache folgendes:

git add *pattern_to_exclude*
git diff
git reset HEAD .

Ich weiß, dass es keine elegante Lösung ist und manchmal nicht verwendet werden kann (z. B. wenn Sie bereits Dinge inszeniert haben), aber es macht den Trick, ohne einen komplizierten Befehl eingeben zu müssen

BlueMagma
quelle
0

Wenn Sie dies nur tun möchten, um das Diff visuell zu überprüfen , können Sie es mit einem visuellen Diff-Tool (wie Meld ) mit einem kurzen Befehl ausführen , der leicht zu merken ist.

Richten Sie zunächst ein Diff-Tool ein, falls Sie dies noch nicht getan haben.

$ git config --global diff.tool = meld

Anschließend können Sie ein Verzeichnis diff ausführen.

$ git difftool --dir-diff

Sie können Diffs (nach Datei) in Meld (oder einem Tool Ihrer Wahl) durchsuchen. Öffnen Sie einfach nicht die Datei, die Sie ignorieren möchten.

mkasberg
quelle