Ich habe das oben genannte bei einem Projekt ausprobiert, das groß genug ist, dass sich git über die Argumentgröße beschwert. Wenn Sie also auf dieses Problem stoßen, gehen Sie wie folgt vor:
Damit können Sie nur Zweige durchsuchen (einschließlich entfernter Zweige).
Sie können sogar einen Bash / Zsh-Alias dafür erstellen:
alias grep_all="git branch -a | tr -d \* | xargs git grep"
grep_all <regexp>
Update August 2016: RM empfiehlt in den Kommentaren
Ich habe ein " fatal: bad flag '->' used after filename" bekommen, als ich die git branchVersion ausprobiert habe . Der Fehler war mit einer HEADAliasing-Notation verbunden.
Ich habe es gelöst, indem ich ein sed '/->/d'in die Pipe zwischen dem trund dem xargsBefehl eingefügt habe.
git branch -a | tr -d \* | sed '/->/d' | xargs git grep <regexp>
Das ist:
alias grep_all="git branch -a | tr -d \* | sed '/->/d' | xargs git grep"
grep_all <regexp>
Es ist keine gute Idee, die Ausgabe von git branchin tr oder sed zu leiten. git branchist ein Porzellankommando für den menschlichen Verzehr. Bevorzugte Alternativen finden Sie unter stackoverflow.com/a/3847586/2562319 .
Ja, schön. Wenn ich mir die anderen Antworten ansehe, denke ich, dass die Antwort von @errordeveloper die sauberste ist: stackoverflow.com/a/21284342/2562319 : "git grep <regexp> $ (git für-jeden-ref --format = '% (refname) 'refs /) "
jbyler
1
Gibt es eine Möglichkeit, den Namen des Zweigs anzuzeigen, der der Suche entspricht?
Franksands
63
git log Dies kann eine effektivere Methode sein, um in allen Zweigen nach Text zu suchen, insbesondere wenn es viele Übereinstimmungen gibt und Sie zuerst neuere (relevante) Änderungen sehen möchten.
Diese Protokollbefehle listen Commits auf, mit denen die angegebene Suchzeichenfolge / Regex (im Allgemeinen) zuerst hinzugefügt oder entfernt wird. Die -pOption bewirkt, dass das relevante Diff dort angezeigt wird, wo das Muster hinzugefügt oder entfernt wurde, sodass Sie es im Kontext sehen können.
Nachdem Sie ein relevantes Commit gefunden haben, das den gesuchten Text hinzufügt (z. B. 8beeff00d), suchen Sie die Zweige, die das Commit enthalten:
Interessanter Alias. +1. Genauer als in meiner Antwort.
VonC
Wie kann Ihr Alias für die Phrasensuche verwendet werden? Wenn ich "foo bar" als Parameter übergebe, erhalte ich: fatal: mehrdeutiges Argument 'bar': unbekannte Revision oder Pfad nicht im Arbeitsbaum. Verwenden Sie '-', um Pfade von Revisionen zu trennen
jutky
Versuchen Sie, dem Raum zu entkommen: "foo \ bar"
Garry Gomez
Dies soll eindeutig die akzeptierte Antwort sein;) Ich habe sie erweitert, um nur nach den neuesten Zweigen meines Projekts zu suchen (Ich habe mehr als 500, frage nicht, und jeder Grep dauert ungefähr 4 Sekunden, also möchte oder brauche ich nicht über mehr als die beispielsweise 100 neuesten von ihnen zu suchen). Dafür habe ich das git for-each-refmit aktualisiert --sort=-committerdate --count=100! Danke für die ursprüngliche Idee!
Vser
6
Es gibt zwei Möglichkeiten: Bash- oder Git-Aliase
Hier sind drei Befehle:
git grep-branch - Suche in allen Filialen lokal & remote
git grep-branch-local - Suche nur in lokalen Filialen
git grep-branch "find my text"
git grep-branch --some-grep-options "find my text"
GREP mit: Git-Aliasen
Datei ~ / .gitconfig
Befehle sollten manuell zur ~/.gitconfigDatei hinzugefügt werden , da git config --global aliasSie den von Ihnen hinzugefügten komplexen Code auswerten und durcheinander bringen.
Hinweis: Wenn Sie Aliase hinzufügen und diese nicht ausgeführt werden können - überprüfen Sie die Backslashes \, für die \\im Vergleich zu Bash- Befehlen möglicherweise ein zusätzliches Escape erforderlich ist .
git branch -a - Alle Zweige anzeigen;
sed -e 's/[ \\*]*//'- Trim Leerzeichen (von branch -a) und * (Name des aktiven Zweigs haben es);
grep -v -e '\\->'- Ignorieren Sie komplexe Namen wie remotes/origin/HEAD -> origin/master;
grep '^remotes' - Holen Sie sich alle Remote-Filialen;
grep -v -e '^remotes'- Holen Sie sich Filialen außer Remote-Filialen;
Beispiel git grep-branch-local -n getTastyCookies
-n Stellen Sie die Zeilennummer den übereinstimmenden Zeilen voran.
git grep-branch "find my text"fatal: ambiguous argument 'client': both revision and filename
Hört sich
Warum immer verwenden -a, die alle Zweige zeigt? Ich würde vorschlagen, Optionen für den git branchBefehl zu verwenden, um Klammern zu trennen. Wenn Sie sich lokale Niederlassungen ansehen, gibt es nur eine einzige *, sodass Sie nicht für sed entkommen müssen. Also: nur git branch | sed -e 's/*/ /' | xargs git grep "TEXT"für lokale Filialen, nur git branch -r | grep -v -- "->" | xargs git grep "TEXT"für entfernte Filialen und git branch -a | grep -v -- "->" | xargs git grep "TEXT"für alle Filialen
Antworten:
Die Frage " Wie kann man festgeschriebenen Code in der Git-Historie durchsuchen? " Empfiehlt:
Das durchsucht alle Commits, die alle Zweige enthalten sollten.
Eine andere Form wäre:
Weitere Beispiele finden Sie in diesem Artikel :
(Siehe eine Alternative im letzten Abschnitt dieser Antwort unten)
Vergessen Sie diese Einstellungen nicht, wenn Sie sie möchten:
Dieser Alias kann auch helfen:
Hinweis: Chernjie schlug vor, dass dies
git rev-list --all
ein Overkill ist.Update August 2016: RM empfiehlt in den Kommentaren
Das ist:
quelle
git branch
in tr oder sed zu leiten.git branch
ist ein Porzellankommando für den menschlichen Verzehr. Bevorzugte Alternativen finden Sie unter stackoverflow.com/a/3847586/2562319 .git log
Dies kann eine effektivere Methode sein, um in allen Zweigen nach Text zu suchen, insbesondere wenn es viele Übereinstimmungen gibt und Sie zuerst neuere (relevante) Änderungen sehen möchten.Diese Protokollbefehle listen Commits auf, mit denen die angegebene Suchzeichenfolge / Regex (im Allgemeinen) zuerst hinzugefügt oder entfernt wird. Die
-p
Option bewirkt, dass das relevante Diff dort angezeigt wird, wo das Muster hinzugefügt oder entfernt wurde, sodass Sie es im Kontext sehen können.Nachdem Sie ein relevantes Commit gefunden haben, das den gesuchten Text hinzufügt (z. B. 8beeff00d), suchen Sie die Zweige, die das Commit enthalten:
quelle
Ich fand das am nützlichsten:
Sie müssen die letzten Argumente anpassen, je nachdem, ob Sie nur entfernte oder lokale Zweige betrachten möchten, dh:
git grep -i foo $(git for-each-ref --format='%(refname)' refs/remotes)
git grep -i foo $(git for-each-ref --format='%(refname)' refs/heads)
Der von mir erstellte Alias sieht folgendermaßen aus:
quelle
git for-each-ref
mit aktualisiert--sort=-committerdate --count=100
! Danke für die ursprüngliche Idee!Es gibt zwei Möglichkeiten: Bash- oder Git-Aliase
Hier sind drei Befehle:
git grep-branch
- Suche in allen Filialen lokal & remotegit grep-branch-local
- Suche nur in lokalen Filialengit grep-branch-remote
- Nur entfernte ZweigeDie Verwendung ist die gleiche wie
git grep
GREP mit: Git-Aliasen
Datei ~ / .gitconfig
Befehle sollten manuell zur
~/.gitconfig
Datei hinzugefügt werden , dagit config --global alias
Sie den von Ihnen hinzugefügten komplexen Code auswerten und durcheinander bringen.Hinweis: Wenn Sie Aliase hinzufügen und diese nicht ausgeführt werden können - überprüfen Sie die Backslashes
\
, für die\\
im Vergleich zu Bash- Befehlen möglicherweise ein zusätzliches Escape erforderlich ist .git branch -a
- Alle Zweige anzeigen;sed -e 's/[ \\*]*//'
- Trim Leerzeichen (vonbranch -a
) und * (Name des aktiven Zweigs haben es);grep -v -e '\\->'
- Ignorieren Sie komplexe Namen wieremotes/origin/HEAD -> origin/master
;grep '^remotes'
- Holen Sie sich alle Remote-Filialen;grep -v -e '^remotes'
- Holen Sie sich Filialen außer Remote-Filialen;Beispiel
git grep-branch-local -n getTastyCookies
-n
Stellen Sie die Zeilennummer den übereinstimmenden Zeilen voran.Die aktuelle Struktur ist:
:
- Trennzeichendev
53
modules/factory/getters.php
function getTastyCookies($user)
GREP mit: BASH
Wie Sie wissen sollten: Bash-Befehle sollten in
.sh
Skripten gespeichert oder in einer Shell ausgeführt werden.Nur lokale Niederlassungen
Nur entfernte Zweige
Lokale und entfernte Niederlassungen
quelle
git grep-branch "find my text"
fatal: ambiguous argument 'client': both revision and filename
-a
, die alle Zweige zeigt? Ich würde vorschlagen, Optionen für dengit branch
Befehl zu verwenden, um Klammern zu trennen. Wenn Sie sich lokale Niederlassungen ansehen, gibt es nur eine einzige*
, sodass Sie nicht für sed entkommen müssen. Also: nurgit branch | sed -e 's/*/ /' | xargs git grep "TEXT"
für lokale Filialen, nurgit branch -r | grep -v -- "->" | xargs git grep "TEXT"
für entfernte Filialen undgit branch -a | grep -v -- "->" | xargs git grep "TEXT"
für alle FilialenSo mache ich das:
quelle
Wenn Sie einem Commit einen SHA-1-Hashwert geben,
git grep
suchen Sie ihn anstelle der Arbeitskopie.Um alle Zweige zu durchsuchen, können Sie alle Bäume mit abrufen
git rev-list --all
. Setzen Sie alles mit... und Geduld haben
quelle