Frage an git – Ausschließen von Dateien aus git-diff

60

Ich verfolge ein Projekt mit Git. Die Arbeitskopie enthält einige Xcode-Projektdateien, die ich nachverfolgen, aber nicht in Diffs anzeigen möchte, da es immer Dutzende geänderter Zeilen gibt, die mich nie interessieren. Gibt es eine einfache Möglichkeit?git-diff überspringe diese Dateien? Ich habe versucht, ein benutzerdefiniertes "unbeaufsichtigtes" Diff-Tool einzurichten:

$ cat .gitattributes 
Project.xcodeproj/* diff=nodiff

$ cat ~/.gitconfig 
[diff "nodiff"]
    command = /bin/true

Aber:

$ git diff
external diff died, stopping at Project.xcodeproj/zoul.mode1v3.

Was mache ich falsch?

Deine Antwort

4   die antwort
7

Sie können einen Alias ​​in Ihrer .git / config verwenden

<code>[alias]
        mydiff = !git diff | filterdiff -x "*/Project.xcodeproj/*"
</code>

Sie benötigen filterdiff (von patchutils) für diesen Trick.

<code>sudo apt-get install patchutils
</code>

Trotzdem ist das Diff nicht perfekt, es hinterlässt etwas Müll:

<code>[email protected]:~/git-filter-test$ git mydiff
diff --git a/Project.xcodeproj/dummy.txt b/Project.xcodeproj/dummy.txt
index 3e1f9e6..89dfed9 100644
diff --git a/dummy2.txt b/dummy2.txt
index 91966ce..d9588a9 100644
--- a/titi.txt
+++ b/titi.txt
@@ -1,3 +1,3 @@
 aaaaaaaaaa
-bbbbbbbbb
 cccccc
+ddd
</code>
Oh ja, | Colordiff | weniger -r. zoul
Das ist sehr schön, danke. Der Müll ist in Ordnung, zumindest weiß ich, dass sich diese Dateien geändert haben. Aber ich verliere die Färbung. Gibt es eine Möglichkeit, sie zurückzubekommen? Ich habe versucht, git diff --color zu erzwingen, aber dann wird filterdiff durch die Farbausblendungen verwirrt und hört auf zu filtern. zoul
Vielen Dank für die Antworten auf diese Frage - filterdiff entspricht fast meinen Anforderungen - der verbleibende "Müll" bereitet mir jedoch Probleme - gibt es eine Möglichkeit, mit filterdiff zu sagen, dass alle Verweise auf eine Datei vollständig entfernt werden? Michael
7

die eine saubere Ausgabe ohne externe Tools ermöglicht (add to.git/config):

<code>[alias]
    mydiff = !git diff -- $(git diff --name-only | grep -Ev "Project.xcodeproj/")
</code>

Dann starte es mit:

<code>git mydiff
</code>

Beachten Sie, dassgit diff --name-only ist besser alsgit ls-files denn es wird eine kürzere Liste von Dateien an übergebengit diff, da nur geänderte Dateien einbezogen werden. Ich habe Probleme damit, die maximale Anzahl von Argumenten in großen Projekten bei der Verwendung zu überschreitengit ls-files.

Ich bin dabei auf Probleme mit komplexen Pfaden gestoßen. Ich vermute, es wäre besser, wenn Sie die Option -z verwenden: "Munge keine Pfadnamen und verwende NULs als Ausgabefeld-Abschlusszeichen". Ben Creasy
85

/bin/true kehrt sofort zurück, ohne die Eingabe zu lesen.git diff denkt daher ziemlich vernünftigerweise, dass es vorzeitig gestorben ist.

Was Sie wirklich tun möchten, ist, das diff-Attribut zu deaktivieren und nicht auf einen falschen Befehl zu setzen. Versuchen Sie dies in Ihrem.gitattributes:

<code>Project.xcodeproj/* -diff
</code>
@Bemmu: Um fair zu sein, habe ich nur das gleiche Muster wie in der Frage verwendet. Es gab keinen Hinweis darauf, dass das Muster in der ursprünglichen Fragestellungssituation nicht funktionierte. CB Bailey
@StevenLu Sie können dies beheben, indem Sie Ihren git-difftool-Helfer patchen, siehestackoverflow.com/a/7674147/2448947 mstrange
Verhindert auch nicht, dass externe Diffs es verarbeiten (kann teilweise daran liegen, dass es jetzt nur als binär behandelt wird, anstatt es zu ignorieren) Steven Lu
Ja, das funktioniert gut, vielen Dank. zoul
0

dass jemand anderes die gleichen Schmerzen hat, die wir hatten. Wir wollten eine bereits festgeschriebene Datei ausschließen.

Dieser Beitrag war viel nützlicher:Arbeiten mit .git / info / Zu spät ausschließen

Insbesondere müssen Sie zum Ignorieren einer Datei den Befehl git remove See verwendengit rm (http://www.kernel.org/pub/software/scm/git/docs/git-rm.html)

Sie testen es, indem Sie gehen

git rm --dry-run *.log
(wenn Sie sagen, dass Sie alle Protokolldateien ausschließen möchten)

dies wird was ausgebenwäre ausgeschlossen, wenn Sie es liefen.

dann

du machst es, indem du gehst

git rm *.log
(oder welcher Dateiname Pfad / Ausdruck auch immer sein mag)

Verwandte Fragen