2012-01-21 41 views
6

對不起,如果這是題外話,但這裏有機會減少在這個網站上的「作業」問題的數量:-)Git可以檢測兩個源文件是否相互拷貝?

我在教C類編程的一類學生工作在一個小C中的數字例程庫。今年,來自幾組學生的源文件在其中存在大量的代碼重複。

(下都能以相同拼寫錯誤printf調試語句。我的意思是,你怎麼啞巴都可以。)

我知道了Git可檢測出兩個源文件是相似到每個人超過一定的閾值,但我從來沒有經理讓它能夠處理兩個不在Git存儲庫中的源文件。

請記住,這些不是特別複雜的學生。他們不太可能會遇到改變變量/函數名稱的麻煩。

有沒有一種方法可以使用Git來檢測重要和字面代碼重複又名抄襲?還是有一些其他的工具,你可以爲此推薦

+2

Git可能不是這方面的正確工具。有代碼抄襲檢測工具可用,我敢肯定,搜索會出現一些。 –

+2

以我的經驗,簡單的差異就夠了。特別是,相同的評論是一個很大的贈品。令人驚訝的是,他們在作弊方面付出了一點努力...... –

回答

3

爲什麼要使用git?一個簡單而有效的技術就是比較所有不同提交文件之間差異的大小,然後手動檢查並比較那些差異最小的差異。

1

你可以使用diff,檢查兩個文件是否似乎相似:

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

這些選項告訴diff忽略空白的變化,並作出gitdiff文件。試用兩個樣品。

+0

請注意,'<'s and '>'的數量差異總是等於文件中行數的差異,無論它們的相似性如何。 :) –

+0

不,並不總是。空格被'-w'排除。 – Blender

2

Moss是一個由斯坦福大學CS教授開發的工具。我認爲他們也在那裏使用它。這就像源代碼的差異。

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,雖然答案似乎重複)中列出的建議之一。

0

使用差異是絕對一個好主意,除非你想在組合子地獄的領域冒險:

  • 如果你有2個意見,你必須執行1個diff來檢查抄襲,
  • 如果你有3個意見,你必須執行2 diff來檢查抄襲,
  • 如果你有4投稿,您必須執行6 DIFF檢查抄襲,
  • ...
  • 如果您有n份提交,您必須執行(n-1)!差異!

另一方面,Moss已在另一個答案中建議使用completely different algorithm。基本上,它爲每個文檔的重要k-gram計算一組指紋。指紋實際上是用來對文檔進行分類的散列,當兩個文檔最終被排序在同一個桶中時,可能會發現抄襲。