wake-up-neo.com

Wie grep Dateien in git Repo?

Ich liebe git grep, in allen Dateien zu suchen, die in einem Repo eingecheckt werden. Es ist toll. Aber ist es möglich, es (oder einen anderen git-Befehl) zu verwenden, um nur Dateien zu finden (unabhängig vom Inhalt)?

Im Moment mache ich das:

$ find . | grep middleware

was funktioniert, aber es verwendet nicht den git-Index, was bedeutet, dass es jede gefundene Datei durchläuft und über Dateien berichtet, die dem .gitignore entsprechen.

Irgendwelche Ideen für clevere Tricks?

28
Peter Bengtsson

Vielleicht möchten Sie git ls-files, der die Dateien im Index auflistet? (und passt sich automatisch an Ihr aktuelles Verzeichnis im git work-Verzeichnis an)

39
araqnid

Ich denke, git ls-files wird den Trick für Sie tun.

So:

 git ls-files "*middleware*"
20
Steven

In diesem Fall können Sie eine Nichtgit-Lösung in Betracht ziehen.

find selbst hat die Fähigkeit, das zu tun, was Sie wollen, effizienter als die Ergebnisse in grep zu leiten:

find . -name 'middleware*'

Sie müssen das Muster zitieren, damit der * nicht von der Shell erweitert wird, bevor er an find übergeben wird.

Es gibt ein leistungsfähiges Programm namens ack, das heißt, besser als grep , und eine meiner Lieblingsanwendungen für ack ist genau das, was Sie erwähnt haben - Dateien finden, die einem Muster in einem Baum entsprechen . ack verwendet Perl-Regexps, jedoch keine Shell-Dateiglobs.

ack -g middleware

Wenn Sie innerhalb dieser Dateien suchen möchten, können Sie dies mit ack einfacher tun, als eine Shell-Schleife über die Ergebnisse von find dieser greps in jeder Datei zu schreiben. Vergleichen Sie die beiden und sehen Sie, welche Sie bevorzugen:

for f in $(find . -name 'middleware*')
do
    grep 'pattern in file' $f
done

versus

ack -G 'middleware' 'pattern in file'

Ich empfehle ack als etwas, das Sie Ihrem Toolkit hinzufügen können.

4
MikeSep

git hat jetzt die Suchfunktion erweitert (wie im vorherigen Poster erwähnt). Sie können Dateinamen, Erweiterungen, nach Programmiersprache suchen. Sie können darin nach Dateiinhalten suchen ... usw.

Sie suchen, wenn Sie sich bei GitHub anmelden, im Suchfeld oben links auf dem Bildschirm.

Einzelheiten finden Sie hier: https://help.github.com/de/articles/searching-code

0
user214810

Ich habe regelmäßig dasselbe Problem, und ich habe einfach git find gehackt - wenn Sie das Debian-Paket nicht verwenden, können Sie einfach das git-find-Skript in /usr/lib/git-core/ (oder vergleichbar) kopieren und es genießen.

Es kann in mehreren Modi verwendet werden, wobei der einfachste der folgenden ist:

git find \*middleware\*        # or
git find '*middleware*'        # which is short for
git find -name '*middleware*'

Die Kombination ist auch möglich (und fast so flexibel wie das reguläre find, Sie müssen nur den -a explizit schreiben):

git find \( -name \*.Java -o -name \*.js \) -a ! -ipath \*/test/\*

Es gibt ein paar weitere Optionen, von denen die meisten mit Filterung des Namens oder des vollständigen Pfads (teilweise, dh unterhalb des aktuellen Arbeitsverzeichnisses), einige davon ohne Berücksichtigung der Groß-/Kleinschreibung (-iname und Freunde), und zwei globale Optionen handeln, eine zum Umschalten zwischen Regex zwischen POSIX Basic (Standard) und POSIX Extended werden Symlinks umgeschaltet (Standardeinstellung). Dadurch werden nur Dateien (und Symlinks) gefunden, keine Verzeichnisse oder Submodule ("Gitlinks").

Es kann auch die Dateiliste an reguläres find (1) übergeben, wenn es nicht zu lang ist (es muss in der Befehlszeile übergeben werden), was beispielsweise Folgendes zulässt:

git find -- -mtime -100

… Zu geringen Kosten für das Dateisystem (find greift auf das Dateisystem zu), andererseits funktionieren fast alle (nicht Suchtiefen-spezifischen Sachen) von find, und Sie können nur Dateien "im Index" bearbeiten, dh bekannt git (vorhanden im HEAD commit oder git added).

Es ist jedoch ein bisschen wählerisch bei ungelösten Konflikten. Wenn Sie Probleme damit feststellen, schreiben Sie mir eine Nachricht (hier oder über IRC).

PS: Fühlen Sie sich frei, um die offiziellen Git-Leute zu unterstützen, um das git-find-Repository unterzubringen. Ich wäre mehr als glücklich, wenn es in git aufgenommen wird (die Lizenz ist noch liberaler, Sie brauchen nur die mksh-Shell Etwas neuere (50 sollte ausreichen) Version, aber es ist heutzutage die am weitesten verbreitete Unix-Shell.

0
mirabilos