git diff 使用外部 diff 工具将(移动/重命名)文件的历史版本更改为当前版本

问题描述 投票:0回答:1

是否有一种简单/好的方法可以使用外部比较工具将文件的任意旧提交版本与当前版本进行比较,无论它是否被移动/重命名。

我需要一个解决方案,我不需要知道过去是否以及何时移动或重命名文件(所以我只知道新名称/路径)。

所以我想提供给 git oneliner / 脚本的是:

  • 当前文件的路径
  • 历史性的承诺 sha
  • 使用什么工具进行比较

我尝试的所有变体都需要文件的旧路径/名称才能工作...在这里,除了我之外,我找不到其他方法来解析和提供它。

我希望 git 也能用它的元数据知识来解析正确的文件路径。至少 git diff -M 似乎能够做到这一点...但是 git difftool -M -- 无法使用新/当前文件启动 difftool ,而 git difftool -M -- 根本不启动 difftool

git diff
1个回答
0
投票

这是另一个可能的技巧,用于找出应在旧提交中检查哪些文件:

$ git diff --name-status --follow <older> <recent> -- <path/to/file>

在我的机器上,我得到一个输出:

R083   old/path/to/file   new/path/to/file

我还不知道

--follow
对于
git diff
的内部细节,我的盲目猜测是它只查看两个提交之间的相似之处,你必须测试和检查该部分。


git diff --name-status
的可能输出是:

[empty]   # <- no diff

[AMD...] path/to/file   # <- no file rename, regular known "Added/Modified/Deleted/..." tag

Rxyz old/path new/path  # <- rename was detected

考虑到这一点,您可以编写一个脚本来检查输出,并在两个文件之间运行适当的 diff 命令。


为了完整起见:获取“提交

path/to/file
时文件
C
的内容”的一种方法是:

git show C:path/to/file

因此,要在路径更改时比较文件内容,可以运行:

# use your favorite diff tool here:
diff <(git show <old>:old/path/to/file) <(git show <recent>:new/path/to/file)
© www.soinside.com 2019 - 2024. All rights reserved.