观察git diff --name-status命令,如何判断文件是否被重命名?

4
我有一个脚本,使用git diff --name-status查找给定分支与master分支之间的差异,并根据每个文件的更改情况执行各种操作。
Git不跟踪重命名。虽然在提交时它知道文件已被重命名,但是git diff --name-status仅显示旧名称已被删除并添加了新名称。对我来说这是一个问题,因为我想对已更名的文件采取额外的步骤。
给定已添加的文件名,如何判断该文件是全新的还是另一个文件的重命名(如果是重命名,则其先前的名称是什么)?
1个回答

7

Git不会追踪重命名操作。

这是真的!但是...

当你提交更改时,它知道文件已被重命名,

实际上,这并不完全正确:Git只是在猜测;git mv不记录重命名操作,你可以手动重命名或复制文件,然后只需按任意顺序执行git rm --cached旧路径和git add新路径,效果相同。

git diff --name-status只显示旧名称已被删除,新名称已被添加。

您可以通过打开重命名检测来使git diff做出与git status相同的猜测。实际上,git status只是在打开重命名检测的情况下运行git diff,并使用一些额外的加速选项(例如,告诉git diff它不需要尝试生成差异,只需使用--name-status信息,当然,当您使用--name-status时也是如此)。
要在运行git diff时启用重命名检测,请执行以下操作:
  • 在命令行中添加-M--find-renames,或者
  • 在配置中将diff.renames设置为true(甚至是copies),或者
  • 升级到Git版本2.9或更高版本,其中默认启用。
请参阅 git diff文档-M-C-B 的描述,以及 git config 中的其他可配置的 diff.* 值。(例如,我将 diff.renameLimit 设置为0。)

我在使用“知道”一词时,是以宽泛的定义来表达的。我意识到这并没有被记录在任何地方。 - zneak
1
我怀疑那个,但我想最好还是明确说明,特别是如果以后有其他人遇到这个问题。 - torek

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