我怎样才能检测到副本和使用git粘贴代码?

时间:2009-12-21 11:41:04

标签: git copy-paste

我刚刚再次阅读了git-blame手册页并注意到了这一部分:

  

一种特别有用的方法是查看添加的文件是否包含通过现有文件复制粘贴创建的行。有时这表明开发人员很草率,并没有正确地重构代码。您可以先找到引入该文件的提交:

     

git log --diff-filter = A --pretty = short - foo

     

然后使用commit ^注释提交及其父项之间的更改!符号:

     

git blame -C -C -f $ commit ^! - foo

这听起来很有趣,但我不太了解它是如何工作的,以及为什么。我想知道是否可以在git hook中使用它来检测copy&粘贴代码。

一些git专家可以解释一起使用上面的git命令的效果,以及是否可以使用类似的东西来使git显示是否存在代码重复(可能使用git似乎计算的'相似性索引')重命名文件时?)

1 个答案:

答案 0 :(得分:10)

您可以单独打破命令。

$ 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的表示法; ^!后缀表示排除所有$ commit的父项。

基本上,第一个命令(git log)可以帮助您找到引入复制行的提交;第二个(git blame)可帮助您找到git log返回的任何可疑提交的