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

ABi*_*ika 5 git rename

我想在重命名完成之前查看过去重命名的文件的内容(当然需要自动检测)。

通过git log --follow foo_renamed.txt并且git show master~20 foo_original_name.txt我可以确认 git 能够跟踪文件重命名并且该文件存在于master~20. 然而,

git show --follow master~20:foo_renamed.txt
Run Code Online (Sandbox Code Playgroud)

git show -M master~20:foo_renamed.txt
Run Code Online (Sandbox Code Playgroud)

都失败了

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

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

tor*_*rek 2

很不幸的是,不行。仅git log --follow实现特殊情况 hack 来跟踪这些类型的检测到的重命名(必须检测它们,一次一个提交,同时回溯历史记录),并且它使用不太适合此任务的代码来实现此目的。

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

调用可能类似于:

git show --follow[=<start>] commit -- path
Run Code Online (Sandbox Code Playgroud)

其中<start>默认为HEAD. 不过,写这篇文章并不简单。

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