我再次阅读git-blame手册页并注意到这一部分:
一种特别有用的方法是查看添加的文件是否具有通过现有文件的复制和粘贴创建的行.有时这表明开发人员很草率,并没有正确地重构代码.您可以先找到引入该文件的提交:
git log --diff-filter = A --pretty = short - foo
然后使用commit ^注释提交及其父项之间的更改!符号:
git blame -C -C -f $ commit ^! - foo
这听起来很有趣,但我不太了解它是如何工作的,以及为什么.我想知道是否可以在git钩子中使用它来检测复制和粘贴的代码.
有些git专家可以解释一起使用上面的git命令的效果,以及是否可以使用类似的东西来使git显示是否存在代码重复(可能使用git似乎在重命名文件时计算的'相似性索引') )?
您可以单独分解命令.
$ git log --diff-filter=A --pretty=short -- foo
显示文件"foo"的日志.该--diff-filter
选项仅显示添加文件的提交("A"),并以压缩格式(--pretty=short
选项)显示.(这--
是说"随后没有任何内容是一个选项"的标准,之后的所有内容都是应该应用日志的文件名列表.)
然后:
$ git blame -C -C -f $commit^! -- foo
git blame
使用上次提交的信息注释文件的每一行.双-C -C
选项主动检查从其他文件复制的行.该-f
选项显示原始提交的文件名(这意味着如果从另一个文件复制了一行,则会看到从中复制的文件的名称).这$commit^!
是$ commit的表示法; 该^!
后缀是指排除所有的$犯的父母.
基本上,第一个命令(git log
)可以帮助您找到引入复制行的提交; second(git blame
)帮助您找到返回的任何可疑提交的来源git log
.