459 Stimmen

Wie kann ich Git-Zweige nach einer Datei oder einem Verzeichnis durchsuchen?

Wie kann ich in Git nach einer Datei oder einem Verzeichnis anhand des Pfads über mehrere Zweige hinweg suchen?

Ich habe etwas in einem Zweig geschrieben, aber ich weiß nicht mehr, in welchem. Jetzt muss ich es finden.

Klärung : Ich bin auf der Suche nach einer Datei, die ich in einem meiner Zweige erstellt habe. Ich möchte sie über den Pfad und nicht über den Inhalt finden, da ich mich nicht mehr an den Inhalt erinnere.

621voto

Dustin Punkte 85400

git log + git branch wird es für Sie finden:

% git log --all -- somefile

commit 55d2069a092e07c56a6b4d321509ba7620664c63
Author: Dustin Sallings <dustin@spy.net>
Date:   Tue Dec 16 14:16:22 2008 -0800

    added somefile

% git branch -a --contains 55d2069
  otherbranch

Unterstützt auch Globbing:

% git log --all -- '**/my_file.png'

Die einfachen Anführungszeichen sind notwendig (zumindest bei Verwendung der Bash-Shell), damit die Shell das glob-Muster unverändert an git weitergibt, anstatt es zu expandieren (genau wie bei Unix find ).

83voto

ididak Punkte 5654

Git ls-tree könnte helfen. Um alle vorhandenen Zweige zu durchsuchen:

for branch in `git for-each-ref --format="%(refname)" refs/heads`; do
  echo $branch :; git ls-tree -r --name-only $branch | grep '<foo>'
done

Dies hat den Vorteil, dass Sie auch mit regulären Ausdrücken nach dem Dateinamen suchen können.

27voto

albfan Punkte 11604

Obwohl ididaks Antwort ist ziemlich cool, und Handwerker5 ein Skript zur Verfügung stellt, fand ich diesen Ansatz ein wenig eingeschränkt.

Manchmal muss man nach etwas suchen, das im Laufe der Zeit auftauchen oder verschwinden kann, warum also nicht alle Commits durchsuchen? Außerdem brauchen Sie manchmal eine ausführliche Antwort und manchmal nur Commit-Treffer. Hier sind zwei Versionen dieser Optionen. Legen Sie diese Skripte in Ihren Pfad:

git-find-file

for branch in $(git rev-list --all)
do
  if (git ls-tree -r --name-only $branch | grep --quiet "$1")
  then
     echo $branch
  fi
done

git-find-file-verbose

for branch in $(git rev-list --all)
do
  git ls-tree -r --name-only $branch | grep "$1" | sed 's/^/'$branch': /'
done

Jetzt können Sie

$ git find-file <regex>
sha1
sha2

$ git find-file-verbose <regex>
sha1: path/to/<regex>/searched
sha1: path/to/another/<regex>/in/same/sha
sha2: path/to/other/<regex>/in/other/sha

Sie sehen, dass mit getopt Sie können das Skript so ändern, dass es abwechselnd alle Commits, Refs, Refs/Heads durchsucht, ausführlich ist, usw.

$ git find-file <regex>
$ git find-file --verbose <regex>
$ git find-file --verbose --decorated --color <regex>

Kasse https://github.com/albfan/git-find-file für eine mögliche Umsetzung.

16voto

Greg Hewgill Punkte 882617

Sie könnten verwenden gitk --all und suchen Sie nach Commits, die "Pfade berühren" und dem Pfadnamen, der Sie interessiert.

12voto

lumbric Punkte 5894

Kopieren und einfügen, um dies zu verwenden git find-file SEARCHPATTERN

Drucken aller gesuchten Zweige:

git config --global alias.find-file '!for branch in `git for-each-ref --format="%(refname)" refs/heads`; do echo "${branch}:"; git ls-tree -r --name-only $branch | nl -bn -w3 | grep "$1"; done; :'

Nur Zweige mit Ergebnissen drucken:

git config --global alias.find-file '!for branch in $(git for-each-ref --format="%(refname)" refs/heads); do if git ls-tree -r --name-only $branch | grep "$1" > /dev/null; then  echo "${branch}:"; git ls-tree -r --name-only $branch | nl -bn -w3 | grep "$1"; fi; done; :'

Diese Befehle fügen einige minimale Shell-Skripte direkt zu Ihrem ~/.gitconfig als globaler Git-Alias .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X