2009-12-21 91 views
15

我刚才读的git-blame手册一次,并注意到这部分:如何使用git检测复制和粘贴的代码?

一个特别有用的方法是看是否新添加的文件已经从现有的文件通过复制和粘贴创建行。有时候这表明开发者很sl and,没有正确地重构代码。你可以先找到犯介绍了与文件:

git的日志--diff过滤= A = --pretty短 - 富

,然后注释提交与其父母之间的变化,用提交^!表示法:

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

这听起来很有趣,但我并不十分注意它是如何工作的,以及为什么。我不知道它是否可以在git钩子中用来检测粘贴代码复制&。

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

回答

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返回的任何可疑提交。

+0

感谢您的解释!双重的'-C -C'标志让git非常有趣 – 2009-12-22 13:35:41