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

Posted

技术标签:

【中文标题】带有重命名检测的 git show 文件(相当于 git log --follow)【英文标题】:git show file with rename detection (equivalent to git log --follow) 【发布时间】:2017-07-11 06:59:15 【问题描述】:

我想在重命名完成之前查看过去在提交状态下重命名的文件的内容(当然是自动检测)。

使用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 选项。还有什么办法吗?谢谢。

【问题讨论】:

【参考方案1】:

很遗憾,没有。只有git log --follow 实现了特殊情况破解来跟踪这些检测到的重命名(它们必须被检测到,一次提交一次,同时回溯历史记录),并且它使用不太适合此的代码这样做任务。

如果您想在 Git 上工作,应该可以修改代码以使其更灵活,并在 git show 中添加一个选项,您可以在其中为 git show 提供提交的 ID,该提交的 ID 是目标提交,但 确实 有该文件。然后,Git 必须像 git log 那样遍历修订版,进行重命名检测(但使用更灵活的代码),以便当提交图遍历到达要显示的提交时,Git 将能够使用以前的名字。

调用可能类似于:

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

其中&lt;start&gt; 默认为HEAD。不过,这是一件不平凡的事情。

(另外,git show应该立即拒绝--follow;它完全允许它的事实是一个小错误。)

【讨论】:

【参考方案2】:

我相信如果 torek 说 git show 现在不能这样做,那就是目前的情况。

我现在的解决方法是:

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

【讨论】:

以上是关于带有重命名检测的 git show 文件(相当于 git log --follow)的主要内容,如果未能解决你的问题,请参考以下文章

git gui app 显示检测到的重命名

禁用 Git 重命名检测

git 检测您的 Java 项目中的重命名/移动效果不佳 - 该怎么办?

让 git 忽略重命名 [重复]

git提交重命名文件

git重命名许多文件和文件夹