带重命名检测的git show文件(相当于git log --follow)

时间:2017-02-21 15:06:51

标签: git rename

我希望在重命名之前看到过去在提交状态下重命名的文件的内容(当然会自动检测)。

使用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,但-- /file/path没有git show选项。还有其他方法吗?感谢。

2 个答案:

答案 0 :(得分:2)

不幸的是,没有。只有git log --follow实现特殊情况hack来跟踪这些检测到的重命名(它们必须被检测到,一次一次提交,同时回溯历史记录),并且它使用不太适合的代码来实现完成这项任务。

如果您想使用Git,可以修改代码以使其更灵活,并向git show添加一个选项,您可以在其中git show提交一个提交的ID是目标提交的后代,但确实拥有该文件。然后Git必须按照git log的方式进行修改,进行重命名检测(但是使用这个更灵活的代码),这样当提交图遍历到达要显示的提交时,Git就能够使用较早的名称。

调用可能类似于:

git show --follow[=<start>] commit -- path

其中<start>默认为HEAD。不过,这是一件非常重要的事情。

(此外,git show 现在应该拒绝--follow;它允许它的事实是一个小错误。)

答案 1 :(得分:1)

我相信如果托雷克说git show现在无法做到这一点,那就是目前的情况。

我现在的解决方法是:

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