使用 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'.
获取重命名文件内容的最有效方法是什么?
答案 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