Gibt es eine Möglichkeit, bestimmte Pfade / Verzeichnisse / Dateien beim Durchsuchen eines Git-Repositorys mit auszuschließen git grep
? Etwas ähnliches wie die --exclude
Option im normalen grep
Befehl?
Ich muss verwenden, git grep
da die grep
direkte Verwendung in großen Git-Repositories zu langsam läuft.
Antworten:
Es ist nicht möglich, wurde aber kürzlich diskutiert . Vorgeschlagene Problemumgehung im Link:
BEARBEITEN siehe nur die Antwort von niemandem , da Git 1.9.0 möglich ist.
quelle
In Git 1.9.0 wurde das "Zauberwort"
exclude
zupathspec
s hinzugefügt . Wenn Sie alsofoobar
in jeder Datei suchen möchten, mit Ausnahme derjenigen, die übereinstimmen*.java
, können Sie Folgendes tun:Oder verwenden Sie die
!
"Kurzform" zum Ausschließen:Beachten Sie, dass in Git-Versionen bis Version 2.12 bei Verwendung eines Ausschlusses
pathspec
mindestens ein "Inklusiv" vorhanden sein musspathspec
. In den obigen Beispielen ist dies das./*
(rekursiv alles unter dem aktuellen Verzeichnis einschließen). In git v2.13 wurde diese Einschränkung aufgehoben undgit grep foobar -- ':!*.java'
funktioniert ohne die./*
.Sie können auch etwas wie
:(top)
(Kurzform :) verwenden:/
, um alles von oben in das Repo aufzunehmen. Aber dann möchten Sie wahrscheinlich auch Ihren Ausschluss so anpassen, dasspathspec
er auch von oben beginnt::/!*.java
(Andernfalls werden nur*.java
Dateien aus Ihrem aktuellen Verzeichnis ausgeschlossen).Es gibt eine gute Referenz für alle "magischen Wörter", die in a
pathspec
bei git-scm.com (oder nurgit help glossary
) erlaubt sind . Aus irgendeinem Grund sind die Dokumente auf kernel.org wirklich veraltet, obwohl sie bei Google-Suchanfragen häufig an erster Stelle stehen.quelle
git grep clock.gettime -- './*' ':!arch/**' ':!drivers/**'
um mehrere ganze Verzeichnisse auszuschließen. Ich denke nicht, dass es eine Rekursion verhindert.git config alias.mygrep '!git grep "$@" -- "${GIT_PREFIX}/*" ":!*.java*" #'
. Dann einfachgit mygrep foobar
. (Mit Alias Shell # Trick und aktuellemgit grep
undgit ls-files
aus Unterverzeichnissen ausprobiert und beide melden Dateinamen relativ zum aktuellen Verzeichnis (selbst wenn Sie die':(top)'
Include-Pfadspezifikation verwenden). Beide Befehle haben die--full-name
Option, Namen relativ zum Stamm zu melden, dies ist jedoch standardmäßig deaktiviert.Update: Für git> = 1.9 gibt es native Unterstützung für Ausschlussmuster, siehe nur die Antwort von one .
Dies mag rückwärts erscheinen, aber Sie können eine Liste von Dateien übergeben, die nicht mit Ihrem Ausschlussmuster übereinstimmen, um Folgendes zu
git grep
mögen:grep -v
Gibt jeden Pfad zurück, der nicht übereinstimmt<exclude-pattern>
. Beachten Sie, dass diesgit ls-files
auch einen--exclude
Parameter erfordert, der jedoch nur auf nicht verfolgte Dateien angewendet wird .quelle
Sie können Dateien oder Verzeichnisse als binär markieren, indem Sie eine Attributdatei in Ihrem Repository erstellen, z
Übereinstimmungen in Binärdateien werden ohne die Einschlusszeile aufgelistet, z
quelle
Mit dem Beispiel von @kynan als Basis habe ich dieses Skript erstellt und es in meinen Pfad (
~/bin/
) als eingefügtgg
. Es werdengit grep
einige angegebene Dateitypen verwendet, aber vermieden.In unserem Repo gibt es viele Bilder, daher habe ich die Bilddateien ausgeschlossen, und dies verkürzt die Serchtime auf 1/3, wenn ich das gesamte Repo durchsuche. Das Skript kann jedoch leicht geändert werden, um andere Dateitypen oder Geleralmuster auszuschließen.
Anmerkung 1
Nach dieser soll es möglich sein , die Sache zu nennen
git-gg
und in der Lage es als regulärer git Befehl zu nennen wie:Aber ich kann das nicht zum Laufen bringen. Ich habe das Skript in meinem erstellt
~/bin/
und einengit-gg
Symlink in erstellt/usr/lib/git-core/
.Anmerkung 2
Der Befehl kann nicht zu einem regulären
sh
Git-Alias gemacht werden, da er dann im Stammverzeichnis des Repos aufgerufen wird. Und das will ich nicht!quelle