Git可以检测两个源文件是否基本上是彼此的副本?

时间:2012-01-21 05:46:30

标签: c git plagiarism-detection

很抱歉,如果这是偏离主题的,但是您有机会减少本网站上的“家庭作业”问题: - )

我正在教授一门C编程课程,学生们在C中使用一个小型的数字例程库。今年,来自几组学生的源文件中有大量的代码重复。

(下至同样拼写错误的printf调试语句。我的意思是,你是多么愚蠢。)

我知道Git可以检测到两个源文件何时彼此相似超过某个阈值但是我从来没有经理让它来处理两个不在Git存储库中的源文件。

请记住,这些并不是特别复杂的学生。它们不太可能会遇到更改变量/函数名称的麻烦。

有没有办法可以使用Git来检测重要的文字代码重复a.k.a抄袭?或者是否有其他可以推荐的工具

5 个答案:

答案 0 :(得分:3)

为什么要使用git?一种简单但有效的技术是比较所有不同提交之间差异的大小,然后手动检查和比较差异最小的那些。

答案 1 :(得分:2)

Moss是由斯坦福大学CS教授开发的工具。我认为他们也在那里使用它。这就像是源代码的差异。

答案 2 :(得分:1)

您可以使用diff并检查两个文件是否相似:

diff -iEZbwB -U 0 file1.cpp file2.cpp

这些选项告诉diff忽略空格更改并生成git - 如diff文件。尝试两个样本。

答案 3 :(得分:1)

添加其他答案,您可以使用diff - 但我不认为答案本身就是有用的。你想要的是匹配的行数,减去非空白行的数量,并且要自动获得,你需要用wc -lgrep来计算总和文件长度减去diff文件的长度减去diff作为匹配包含的空行数。即使这样,你也会错过diff因为在它们之前插入不同的东西而确定相同的行不匹配的情况。

更好的选择是https://stackoverflow.com/questions/5294447/how-can-i-find-source-code-copying(或https://stackoverflow.com/questions/4131900/how-to-detect-plagiarized-code中列出的建议之一,但答案似乎重复了。)

答案 4 :(得分:0)

除非你想冒险进入组合地狱的境界,否则使用diff绝对不是一个好主意:

  • 如果您有2个提交,则必须执行1个差异来检查剽窃,
  • 如果您有3个提交,则必须执行2个差异来检查剽窃,
  • 如果您有4个提交,则必须执行6个差异来检查剽窃,
  • ...
  • 如果您有n个提交,则必须执行(n-1)! diff!

另一方面,Moss已在其他答案中提出,使用completely different algorithm。基本上,它计算每个文档的重要k-gram的一组指纹。指纹实际上是用于对文档进行分类的哈希,当两个文档最终在同一个存储桶中排序时,会检测到可能的抄袭。