如何有效地查看在git下维护的重命名文件的内容?

时间:2014-08-02 22:46:58

标签: git rename git-log

使用 git 命令

git log --follow --pretty='format %H %ae %ai' foo.c

我收到了影响文件foo.c的更改列表。然后,从 git log 输出中给出哈希 H ,我可以运行

git show H:foo.c

在该时间点查看文件的内容。

如果文件已重命名,则无效; git 抱怨:

fatal: Path 'foo.c' exists on disk, but not in '34cd81d75f398ee455e61969b118639dacbfd7a6'.

获取重命名文件内容的最有效方法是什么?

1 个答案:

答案 0 :(得分:2)

编辑:我刚刚意识到,您可以将--diff-filter=R添加到git log --follow命令中。 (我已将此编辑为答案。)这样可以减少要检查的哈希数,减少重命名相关文件的哈希数。但是,仍然必须单独提取文件重命名。


上面的评论变成了一个脚本......没有关于它有多漂亮的说法。 :-)它需要更多的工作才能变成一个真正的命令。

#! /bin/sh

# Find git commits that rename the given path.
identify()
{
    local path="$1"
    local IFS=$'\t'

    # 1) log with follow to extract hashes that rename the file
    #
    # 2) diff-tree each hash to get the actual rename involved
    #
    # 3) extract the hash and :<...>R line with old/new paths
    git log --follow --pretty='format:%H' --diff-filter=R -- "$path" |
    while read hash; do
        echo $hash
        git diff-tree -M -r --diff-filter=R $hash
    done |
    while read line; do
        case "$line" in
        :*)
            set -- $line
            # $2 is oldname, $3 is new name
            # we already have the new name, we need to back
            # up to the old one.
            [ "$3" != "$path" ] && continue
            # at and before this commit, use $2, the old name
            echo at and before $hash use $2
            path=$2;;
        *)
            hash=$line;;
        esac
    done
}

identify builtin/var.c