3 Stimmen

Wie kann man die Historie eines Repos durchsuchen?

Habe ein Repo mit vielen Commits. Ich kenne den Namen der Datei, und die Sache (eine Zeichenkette, einige Koeffizienten, um genau zu sein), die ich suche, aber ich weiß nicht, in welchem Commit sie ist. Es ist nicht mehr in der aktuellen, das ist sicher, noch ist es in den wenigen vorherigen.

* Wie kann ich suchen? Zeitweise sozusagen, für eine bestimmte Sache innerhalb einer bestimmten Datei (oder innerhalb des gesamten Repo, ist mir egal), so dass er alle Commits durchgeht, bis er sie findet?*

Ich interessiere mich sowohl für Mercurial als auch für Git. Verwenden Sie beide derzeit, und ich weiß nicht wirklich, ob dies in einem von ihnen möglich ist.

3voto

Tim Henigan Punkte 57320

Mercurial hat die grep Befehl. Aus der Dokumentation:

hg grep [OPTION]... MUSTER [DATEI]...

Suche nach einem Muster in bestimmten Dateien und Revisionen

Search revisions of files for a regular expression.

This command behaves differently than Unix grep. It only accepts
Python/Perl regexps. It searches repository history, not the working
directory. It always prints the revision number in which a match appears.

By default, grep only prints output for the first revision of a file in
which it finds a match. To get it to print every revision that contains a
change in match status ("-" for a match that becomes a non-match, or "+"
for a non-match that becomes a match), use the --all flag.

Für Git scheint diese Frage von Bedeutung zu sein:

Wie kann man in der Git-Historie nach übertragenem Code suchen?

2voto

Oesor Punkte 6592

Git verfügt auch über den Befehl grep.

git grep regex $(git rev-list --all) file

Siehe Wie kann man in der Git-Historie nach übertragenem Code suchen? für weitere Möglichkeiten der Suche.

1voto

Lily Ballard Punkte 175449

Mit Git können Sie mit einer Spitzhacke suchen. Es gibt zwei interessante Flags zu git log :

-S<string>
    Look for differences that introduce or remove an instance of <string>.
    Note that this is different than the string simply appearing in diff
    output; see the pickaxe entry in gitdiffcore(7) for more details.

Damit können Sie die Commits finden, die eine bestimmte Zeichenfolge hinzufügen oder entfernen.

-G<regex>
    Look for differences whose added or removed line matches the given
    <regex>.

Damit können Sie Commits finden, bei denen eine hinzugefügte oder entfernte Zeile mit dem regulären Ausdruck übereinstimmt.

Sie können dies auf eine bestimmte Datei anwenden, indem Sie die Ausgabe von git log con -- filename z.B. git log -Scoeff -- myfile.c

0voto

Lazy Badger Punkte 90982

Mercurial (frisch) haben . die es erlaubt, alles zu finden und einfacher ist als die Verwendung von grep (in common)

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