22

gitコマンド_

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

foo.txt名前を変更した後、それに触れる一連のコミットを提供します。

git log各コミットの横に対応する履歴ファイル名も出力するコマンドがあるかどうか疑問に思います。

これは次のよう'%F'になり、ファイル名の(実際には存在しない)プレースホルダーであると解釈できます。

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

私はこれがで達成できることを知っています

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

ただし、重要な解析が必要になるため、出力は理想的ではありません。各コミットは複数の行に散らばっていますが、ファイルの名前変更構文("bar.txt => foo.txt")を解析して、探しているものを見つける必要があります。

4

3 に答える 3

20

次のように少し簡略化できます。

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

このような出力が得られます

621175c4998dfda8da

README.md
d0d6ef0a3d22269b96

README.md

これは、解析が少し簡単になるはずです。たとえば、番兵を使用して、次のように改行を削除できます。

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

これにより、同じ行にハッシュとファイル名が表示されます。

621175c4998dfda8da README.md
d0d6ef0a3d22269b96 README.md

sedの呼び出しについては、sedを使用して改行(\ n)を置き換えるにはどうすればよいですか?を参照してください。これは私がそのビットに基づいた答えを持っています。

于 2012-11-29T06:40:12.107 に答える
15

--name-statusあなたのために働くはずです:

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

結果は次のようになり、PerlまたはPythonで簡単に解析できます。

'4da4d5e3e9c24251e14d20004a853b72bd096cce'

R100    b.txt   c.txt
'4966238c97198d096f0424a0a23ec550297d8086'

M       b.txt
'c0e41c11f0f7c5a7650cedfbad138c8941444023'

R100    a.txt   b.txt
'4b2318c0fbabd836d50cabd70bf19013d3964856'

A       a.txt

あなたがそれを一行で取得することを主張するなら、このPerlワンライナーはトリックを行います(それはそのままWindowsで動作します。Linuxでは、一重引用符を使用するか、としてエスケープ$します\$):

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

印刷するもの:

'4da4d5e3e9c24251e14d20004a853b72bd096cce' c.txt
'4966238c97198d096f0424a0a23ec550297d8086' b.txt
'c0e41c11f0f7c5a7650cedfbad138c8941444023' b.txt
'4b2318c0fbabd836d50cabd70bf19013d3964856' a.txt
于 2012-11-27T07:37:02.227 に答える
0

これはOSXターミナルで機能します:

git log --format='%%%h' --name-only --follow -- README.md | xargs echo | perl -pe 's/\%/\n/g'
于 2016-05-29T20:04:41.230 に答える