2012-11-19 12 views
20

Komenda gitładnie wyświetla plik zmień historię w dzienniku git

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

daje szereg zatwierdzeń, które dotykają foo.txt, po drugiej stronie to zmienia nazwę.

Zastanawiam się, czy istnieje polecenie git log, które również wyświetli odpowiednią historyczną nazwę pliku obok każdego zatwierdzenia.

To byłoby coś takiego, gdzie możemy interpretować '%F' jako (właściwie nieistniejący) symbol zastępczy nazwy pliku.

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

Wiem, że to może być realizowane z

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

ale wyjście nie jest idealna, ponieważ wymaga trochę nietrywialne parsowania; każde zatwierdzenie jest rozrzucone na wiele wierszy, a będziesz nadal musiał przeanalizować składnię zmiany nazwy pliku ("bar.txt => foo.txt"), aby znaleźć to, czego szukasz.

+0

% H jest długi try '% h' krótszy popełnić hash. EDYCJA: I masz rację '% F' nie istnieje, ale'% f' robi. –

Odpowiedz

16

można uprościć go trochę tak:

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

który daje wyjście rodzaju jak ten

621175c4998dfda8da 

README.md 
d0d6ef0a3d22269b96 

README.md 

który powinno być trochę łatwiejsze do przeanalizowania. Na przykład można użyć Sentinel i sed się z nowej linii tak:

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

która powinna dać ci hash i nazwę pliku na tej samej linii:

621175c4998dfda8da README.md 
d0d6ef0a3d22269b96 README.md 

do informacji na sed inwokacji, patrz How can I replace a newline (\n) using sed?, na którą mam odpowiedź oparłem ten bit.

14

--name-status powinny pracować dla Ciebie:

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

Wynik będzie wyglądać i mogą być łatwo analizowane przez Perl lub Python:

'4da4d5e3e9c24251e14d20004a853b72bd096cce' 

R100 b.txt c.txt 
'4966238c97198d096f0424a0a23ec550297d8086' 

M  b.txt 
'c0e41c11f0f7c5a7650cedfbad138c8941444023' 

R100 a.txt b.txt 
'4b2318c0fbabd836d50cabd70bf19013d3964856' 

A  a.txt 

Jeśli upierasz się je zdobyć w jednym linia, ta jedna linijka Perla robi lewę (działa na Windowsie tak jak jest. W systemie Linux, użyj pojedynczych cudzysłowów lub uciec $ jako \$):

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

która drukuje:

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

Działa to w terminalu OSX:

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