使用重命名检测查看文件的Git显示(相当于git log --follow)

4

我想查看一个文件的内容,该文件在重命名之前已被提交(当然要自动检测)。

使用git log --follow foo_renamed.txtgit show master~20 foo_original_name.txt,我可以确认git能够跟踪文件重命名,并且该文件存在于master~20中。但是,

git show --follow master~20:foo_renamed.txt

并且

git show -M master~20:foo_renamed.txt

两种方法都失败了,错误信息如下:

致命错误:路径“foo_renamed.txt”存在于磁盘上,但在“master~20”中不存在。

这其实是有道理的,因为对象规范是一个<rev>:<path>的 blob,但是git show没有-- /file/path选项。还有其他的办法吗?谢谢。

2个回答

2
很遗憾,不行。只有 `git log --follow` 实现了特殊情况下的跟踪检测重命名(必须逐个提交地通过历史回溯来检测),但它使用的代码并不非常适合这个任务。
如果你想在 Git 上工作,可以修改代码使其更加灵活,并添加一个选项给 `git show`,让你给出一个是目标提交的后代的提交 ID 的 `git show`,但该文件确实存在。Git 然后需要遍历修订版,就像 `git log` 一样,使用这个更灵活的代码进行重命名检测,以便当提交历史到达要显示的提交时,Git 将能够使用早期的名称。
调用可能类似于:
git show --follow[=<start>] commit -- path

<start> 默认为 HEAD。不过这个并不容易编写。

(另外,git show 现在应该会拒绝使用 --follow;允许使用该选项实际上是一个小 bug。)


2

我相信如果Torek说git show目前无法做到这一点,那就是当前的情况。

我的解决方法是:

git show master~42:`git log --follow master~42..master \
--name-only --oneline -- path/to/file | tail -n1`

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接