2012-11-19 10 views
20

Der git Befehlschön angezeigt Datei

git log --format='%H' --follow -- foo.txt 

Sie die Reihe von Commits gibt Geschichte in git log umbenennen, die foo.txt berühren, nachdem es über umbenennt.

Ich frage mich, ob es einen git log Befehl gibt, der auch den entsprechenden historischen Dateinamen neben jedem Festschreiben druckt.

Es wäre etwas wie das, wo wir '%F' interpretieren können, um der (tatsächlich nicht existent) Platzhalter für den Dateinamen zu sein.

git log --format='%H %F' --follow -- foo.txt 

Ich weiß, das

git log --format='%H' --follow --numstat -- foo.txt 

mit

erreicht werden könnte, aber der Ausgang ist nicht ideal, da es einige nicht-triviale Analyse erfordert; Jedes Commit wird über mehrere Zeilen verteilt, und Sie müssen die Datei-Umbenennungssyntax ( "bar.txt => foo.txt") analysieren, um zu finden, nach was Sie suchen.

+0

% H ist zu lange versuchen '% H-für einen kürzeren Hash begehen. EDIT: Und Sie haben Recht "% F" existiert nicht, aber '% f' tut. –

Antwort

16

Sie es ein bisschen wie diese vereinfachen kann:

git log --format='%H' --name-only --follow -- README.md 

, die Sie Ausgabe der Art wie dieses

621175c4998dfda8da 

README.md 
d0d6ef0a3d22269b96 

README.md 

geben die sollte ein wenig einfacher zu analysieren sein. Zum Beispiel können Sie eine Sentinel verwenden und sed aus die Zeilenumbrüche wie folgt aus:

git log --format='%H%%' --name-only --follow -- README.md | sed ':a;N;$!ba;s/%\n\n/ /g' 

, die Sie den Hash und den Dateinamen in der gleichen Zeile geben sollte:

621175c4998dfda8da README.md 
d0d6ef0a3d22269b96 README.md 

Für Informationen über die sed-Aufruf, siehe How can I replace a newline (\n) using sed?, das hat die Antwort, die ich basiere, dass Bit auf.

14

--name-status sollte für Sie arbeiten:

git log --follow --name-status --format='%H' -- foo.txt 

Ergebnis wie folgt aussehen und kann leicht von Perl oder Python analysiert werden:

'4da4d5e3e9c24251e14d20004a853b72bd096cce' 

R100 b.txt c.txt 
'4966238c97198d096f0424a0a23ec550297d8086' 

M  b.txt 
'c0e41c11f0f7c5a7650cedfbad138c8941444023' 

R100 a.txt b.txt 
'4b2318c0fbabd836d50cabd70bf19013d3964856' 

A  a.txt 

Wenn Sie es in einem bekommen bestehen Zeile, dieser Perl-One-Liner macht den Trick (es funktioniert auf Windows wie es ist. Unter Linux, verwenden Sie einfache Anführungszeichen oder escape $ als \$):

git log --follow --name-status --format='%H' -- c.txt | perl -e "while(<>){chomp;print;<>;$_=<>;print q/ /,((split/\t/)[-1]);}" 

die druckt:

'4da4d5e3e9c24251e14d20004a853b72bd096cce' c.txt 
'4966238c97198d096f0424a0a23ec550297d8086' b.txt 
'c0e41c11f0f7c5a7650cedfbad138c8941444023' b.txt 
'4b2318c0fbabd836d50cabd70bf19013d3964856' a.txt 
0

Dies funktioniert in OSX Terminal:

git log --format='%%%h' --name-only --follow -- README.md | xargs echo | perl -pe 's/\%/\n/g'