Ich habe ein Git-Repository mit wenigen Zweigen und baumelnden Commits. Ich möchte alle diese Commits im Repository nach einer bestimmten Zeichenfolge durchsuchen.
Ich weiß, wie man ein Protokoll aller Commits in der Geschichte erstellt, aber diese enthalten keine Zweige oder baumelnden Blobs, sondern nur die Geschichte von HEAD. Ich möchte sie alle bekommen, um ein bestimmtes Commit zu finden, das verlegt wurde.
Ich würde auch gerne wissen, wie das in Mercurial geht, da ich über den Wechsel nachdenke.
Antworten:
Sie können baumelnde Commits mit sehen
git log -g
.Sie können dies also tun, um eine bestimmte Zeichenfolge in einer baumelnden Festschreibungsnachricht zu finden:
Wenn Sie alternativ die Änderungen nach einer bestimmten Zeichenfolge durchsuchen möchten, können Sie auch die Suchoption für Spitzhacken "-S" verwenden:
Git 1.7.4 fügt die Option -G hinzu , mit der Sie -G <regexp> übergeben können, um festzustellen, wann eine Zeile mit <regexp> verschoben wurde, was -S nicht kann. -S zeigt Ihnen nur an, wann sich die Gesamtzahl der Zeilen mit der Zeichenfolge geändert hat (dh Hinzufügen / Entfernen der Zeichenfolge).
Schließlich können Sie gitk verwenden, um die baumelnden Commits zu visualisieren mit:
Verwenden Sie dann die Suchfunktionen, um nach der falsch platzierten Datei zu suchen. All diese Arbeiten setzen voraus, dass das fehlende Commit nicht "abgelaufen" ist und Müll gesammelt wurde. Dies kann passieren, wenn es 30 Tage lang baumelt und Sie Reflogs ablaufen lassen oder einen Befehl ausführen, der sie abläuft.
quelle
!git fsck --unreachable | sed -ne 's/^unreachable commit //p' | xargs git log --no-walk
In Mercurial verwenden Sie, um
hg log --keyword
in den Festschreibungsnachrichten nach Schlüsselwörternhg log --user
zu suchen und nach einem bestimmten Benutzer zu suchen. Siehehg help log
für andere Möglichkeiten , um das Protokoll zu begrenzen.quelle
hg log -k
Suchvorgänge schreiben Benutzernamen und Dateinamen auch in Änderungssätzen fest (ich sehe das in command.py:log), was eines der wenigen Dinge ist, die ich in hg nicht verstehe. Es sollte separate Optionen zum Suchen in Festschreibungsnachrichten und Dateinamen geben. Scheinthg log --template '{desc}\n'|grep
der sichere Weg zu sein.hg grep --all <term>
Neben der Richq-Antwort zur Verwendung von
git log -g --grep=<regexp>
odergit grep -e <regexp> $(git log -g --pretty=format:%h)
: Schauen Sie sich die folgenden Blog-Beiträge von Junio C Hamano an, dem aktuellen Git-BetreuerZusammenfassung
Sowohl git grep als auch git log --grep sind zeilenorientiert , da sie nach Linien suchen, die dem angegebenen Muster entsprechen.
Sie können Commits verwenden
git log --grep=<foo> --grep=<bar>
(oder dies wirdgit log --author=<foo> --grep=<bar>
intern in zwei übersetzt--grep
), um Commits zu finden, die mit einem der Muster übereinstimmen (implizite ODER semantische).Aufgrund der zeilenorientierten Ausrichtung besteht die nützliche UND- Semantik
git log --all-match --grep=<foo> --grep=<bar>
darin, ein Commit zu finden , bei dem sowohl die erste als auch die zweite Zeile irgendwo übereinstimmen.Mit
git grep
Ihnen mehrere Muster kombinieren können (alle , die das verwenden müssen ,-e <regexp>
Form) mit--or
(was der Standard ist),--and
,--not
,(
und)
. Für grep--all-match
bedeutet, dass die Datei Zeilen haben muss, die mit jeder der Alternativen übereinstimmen.quelle
Aufbauend auf der Antwort von rq fand ich, dass diese Zeile das tut, was ich will:
Hiermit werden die Festschreibungs-ID, der Dateiname und die übereinstimmende Zeile wie folgt angezeigt:
... Ist jemand damit einverstanden, dass dies eine gute Option wäre, um in den Standardbefehl git grep aufgenommen zu werden?
quelle
Jeder Befehl, der Referenzen als Argumente verwendet, akzeptiert die
--all
in der Manpage dokumentierte Optiongit rev-list
wie folgt:So werden beispielsweise
git log -Sstring --all
alle Commits angezeigt, die erwähnt werdenstring
und auf die über einen Zweig oder ein Tag zugegriffen werden kann (ich gehe davon aus, dass Ihre baumelnden Commits mindestens mit einem Tag benannt sind).quelle
git grep
, wenn es so--all
aussieht, als würde es übersetzt / verwendet als--all-match
. Das sieht für mich nach einem Fehler aus. Mit Git 1.7.2.3 (mit$(git rev-list --all)
Works).Mit Mercurial machst du a
Es gibt andere Optionen, die den Bereich der gesuchten Revisionen einschränken.
quelle
hg grep --all
Ich weiß nichts über Git, aber in Mercurial würde ich die Ausgabe von hg log einfach an ein sed / perl / any-Skript weiterleiten, um nach dem zu suchen, wonach Sie suchen. Sie können die Ausgabe des hg-Protokolls mithilfe einer Vorlage oder eines Stils anpassen, um die Suche zu vereinfachen, wenn Sie dies wünschen.
Dies schließt alle benannten Zweige im Repo ein. Mercurial hat nicht so etwas wie baumelnde Blobs afaik.
quelle
Wenn Sie ein vim-Benutzer sind, können Sie tig (apt-get install tig) installieren und mit demselben Befehl nach vim suchen
https://blogs.atlassian.com/2013/05/git-tig/
quelle
Um nur eine weitere Lösung hinzuzufügen, die noch nicht erwähnt wurde, musste ich sagen, dass die Verwendung des grafischen Suchfelds von gitg die einfachste Lösung für mich war. Es wird das erste Vorkommen ausgewählt und Sie können das nächste mit Strg-G finden.
quelle
Ein Befehl in Git, von dem ich denke, dass es viel einfacher ist, einen String zu finden:
funktioniert in Git 2.0.4
quelle