2017-06-08 9 views
2

古いコミットでファイルの名前が分かっているとします。しかしそれ以来、名前の変更や移動が行われています。 HEADのリビジョンでどのように見つけることができますか?また、古いHEADから現在のHEADに至るまでの歴史をどのように見ることができますか?古いgitコミットの元の名前からHEADのファイルを探します。

たとえば、Linuxカーネルバージョン3.8では、ファイルdrivers/usb/gadget/u_serial.cがありました。しかし、最近のカーネルでは、そのファイルはもはや存在しません。私は3.8で知っていたポイントから現在のHEADまでのファイルの履歴を見たいと思います。

+1

'--follow'と' --reverse'を 'git log'に組み合わせることができます。あなたはできるはずですが、できません。 – torek

+1

'git log --diff-filter = D - drivers/usb/gadget/u_serial.c'です。現在の名前を知っているなら '--followと--diff-filter = R'が必要です。 '--'の後ろに古い名前や現在の名前があっても' --follow'と '--diff-filter = RD'の両方で動作します。 – ElpieKay

答えて

0

それは少しずさんだが、次のスクリプトは、もはや存在しないファイルから始まる名前の変更履歴をトレースします。

#!/bin/sh 

file=$1 

while true 
do 
    # find the commit in which $file disappeared 
    revhash=$(git log --pretty=%H --diff-filter=D -n 1 $revspec -- $file) 

    # break out if $file has not disappeared since $revhash 
    test -z "$revhash" && break 
    revspec=${revhash}.. 
    echo -n "$revhash renamed $file => " 

    # $revhash corresponds to the commit in which $file was removed, i.e. renamed 
    # so we combine grep, cut, sed, and diff-tree to figure out what it was renamed to 
    file=$(git diff-tree -M --numstat $revhash | grep '=>' | cut -f3- | sed "s/\(.*\){\(.*\) => \(.*\)}\(.*\)/\1\2\4 => \1\3\4/;s/\/\//\//g" | grep $file | sed "s/.* => //") 
    echo "$file" 
    test -z "$file" && echo -e "???\nNo rename target found, presumably file was deleted." && break 
done 

をして、あなたがその歴史をトレースするためにあなたに返された最後のファイル名をgit log --followすることができます。

関連する問題