2009-12-07 4 views
13

Sagen wir, ich habe eine Datei A.cpp, und ich bemerke einen Fehler in Zeile 15 der Datei zu finden. Nehmen wir an, der Fehler ist ein "const" für eine Funktion, die einen Zeiger auf eine Membervariable zurückgibt, dh die Verwendung von const für die Funktion ist technisch korrekt, aber semantisch falsch. Ich möchte die Semantik mit dem Autor besprechen, der die Änderung vorgenommen hat.git Mit ersten Einführung von Token auf einer bestimmten Zeile einer Datei

Mit git gibt es eine Möglichkeit herauszufinden, welche Revision das "const" Token eingeführt hat? Genauer gesagt würde ich gerne wissen, wer das Token eingeführt hat.

"git blame" zeigt, wer die letzte Änderung an der Zeile vorgenommen hat, aber ich würde eigentlich gerne das erste Commit finden, das das Token enthält.

+0

Können Sie nicht jede Revision differieren, bis sie angezeigt wird? Tut mir leid, ich weiß nicht viel über Git, aber das würde ich für andere Quellcodeverwaltungssysteme tun. –

+0

Ja, aber das könnte sehr zeitaufwendig sein ... Die Historie für das Repository reicht mindestens 3 Jahre zurück mit mehreren tausend Commits für diese Datei. Dies scheint eine ziemlich häufige Aufgabe zu sein, es scheint, als wäre es ein besserer Weg, dies zu tun. – paxos1977

+0

Siehe auch [git: Finden eines Commits, das eine Zeichenfolge einführte] (http://stackoverflow.com/questions/5816134/git-finding-a-commit-that-introduced-a-string). –

Antwort

13

git bisect ist was Sie suchen. Mit diesem Befehl können Sie schnell herausfinden, was commit die const eingeführt hat.

Sie starten den Prozess mit git bisect start, dann markieren Sie eine alte Version ohne die const so gut mit git bisect good und und die aktuelle als bisect bad. Dann schickt das System Sie zu einer Version in der Mitte. Du kannst überprüfen, ob der böse const da ist, und diese Version als gut oder schlecht markieren, abhängig davon. Dann wird der Prozess wiederholt, bis Sie das schlechte Commit gefunden haben.

+4

Wenn Sie ein einfaches Skript schreiben können, das mit 1 endet, wenn die Konstante da ist (d. H. Einen "schlechten" Zustand), rufen Sie 'git bisect run myscript' auf, lehnen Sie sich zurück und genießen Sie git, die Arbeit für Sie zu erledigen ... –

1

Ich verwende hierfür QGit, wähle die interessierenden Zeilen aus und filtere danach, dann siehst du nur die Änderungsliste für diese Zeile. Für eine einzelne Zeile muss es nicht um ein paar Revisionen herumspringen.

über:

  • offen QGit auf Repository
  • offen Baumansicht
  • find Datei
  • find Linie
  • Auswahlleitung von Interesse
  • Presse 'Filter Revision der ausgewählten Linien' Schaltfläche, sieht aus wie ein Trichter.
2

Wenn die Linie in einigen ohne const Token existierte verpflichten, dass Sie wissen, Sie dort starten und die --reverse Flagge auf git-Schuld verwenden, um die letzte Revision zu finden, in dem die Linie nicht den const Token hat . Sehen Sie sich dann die nächste Revision der Datei an.

4

Die Änderung war möglicherweise nicht immer in Zeile 15 von A.cpp, verwenden Sie also den umgebenden Kontext. Sagen Sie es eine Definition von const int foobar war:

git grep 'const *int *foobar' \ 
    $(git log --reverse --pretty=format:%H -- A.cpp) -- \ 
    A.cpp | head -1 

Dies sucht in der Zeit vorwärts durch alle auf dem aktuellen Zweig verpflichtet, die A.cpp und findet die erste Berührung, die das störende Muster enthält. Die Ausgabe ist die SHA-1 des Commits und die zugehörige Zeile in der Revision von A.cpp.

Sobald Sie die Festschreibung kennen, verwenden Sie git show, um den Autor zu lernen.

28

Es gibt ein paar Möglichkeiten, es zu tun.

  • git blame oder besser grafische Schuld Werkzeug (wie git gui blame oder die Schuld Ansicht in git instaweb/gitweb) Geschichte einer Linie zu sehen, in der Geschichte geht zurück bis Sie finden entsprechende begehen.

  • so „pickaxe Suche“ genannt, dh git log -S mit entsprechenden Token/regexp, (Liste) alle verpflichtet, wo Anzahl gegebener Token zu finden geändert (was in der Regel bedeutet, wo gegeben Token oder gelöscht wurde hinzugefügt), zB:

    git log --reverse -p -S'const int foobar' -- A.cpp 
    
  • git bisect wo „schlecht“ begehen würde das mit ‚const‘ bedeuten, wo es nicht (Prüfung zB mit grep) sein sollte.