为何未指定--find-renames时Git仍检测重命名及如何查看相似度指数
为什么未指定--find-renames也能检测到重命名?
其实你遇到的是Git版本迭代后的默认行为变化——在Git 2.9及之后的版本中,重命名检测已经默认启用了,默认的相似度阈值是50%(也就是当文件内容的相似度超过一半时,Git就会自动将其识别为重命名操作)。
虽然官方文档里还标注着需要指定--find-renames才启用,但这部分内容没跟上版本更新的节奏。你可以通过运行git config --get diff.renames查看当前默认配置,如果返回true,就说明重命名检测是默认开启的;要是想关闭默认检测,也能通过git config --global diff.renames false修改。
如何让Git识别Tests/ProgramTest.cs => Tests/StringExtensionsTest.cs为重命名并显示相似度?
要让Git明确识别这次重命名并展示相似度指数,你可以试试以下几种操作:
强制启用重命名检测并调整相似度阈值:
使用-M(--find-renames的短参数),如果默认的50%阈值不够(比如文件修改较多),可以指定具体百分比,比如要求90%相似度才识别为重命名:git log --name-status -1 -M90%这样Git会计算文件内容的相似度,达到你设定的阈值时,就会把它标记为重命名。
查看带相似度的详细差异:
要是想在输出里直接看到相似度数值,可以加上-p参数显示补丁内容,Git会在diff信息里明确标注重命名的相似度:git log -p -1 -M输出会类似这样:
rename from Tests/ProgramTest.cs
rename to Tests/StringExtensionsTest.cs
similarity index 85%全局配置默认的重命名检测阈值:
如果你希望以后所有操作都用更高阈值识别重命名,可以修改全局配置:git config --global diff.renameLimit 1000 git config --global diff.renameThreshold 80这里
renameThreshold设为80(即80%相似度),renameLimit是Git检测重命名的文件数量上限,避免因文件过多导致性能问题。
另外要注意:如果文件是先删除再新建的(而非用git mv操作的重命名),Git会更依赖内容相似度来识别,这时候调整阈值就尤为关键。
内容的提问来源于stack exchange,提问作者user746461

