Может ли Git определить, являются ли два исходных файла по сути копиями друг друга? - PullRequest
6 голосов
/ 21 января 2012

Извините, если это не по теме, но у вас есть шанс уменьшить количество «домашних заданий» на этом сайте: -)

Я преподаю класс программирования C, на котором работают студентыв небольшой библиотеке числовых подпрограмм на C. В этом году исходные файлы нескольких групп учащихся содержали значительное количество дублирующегося кода.

(вплоть до идентично написанных с ошибками printf операторов отладки. Я имею в виду,насколько вы можете быть глупы.)

Я знаю, что Git может обнаружить, когда два исходных файла похожи друг на друга за определенный порог, но я никогда не смог заставить это работать на двух исходных файлах, которые не находятся вGit репозиторий.

Имейте в виду, что это не особенно искушенные ученики.Маловероятно, что они столкнутся с проблемой изменения имен переменных / функций.

Есть ли способ, с помощью которого я могу использовать Git для обнаружения значительного и буквального дублирования кода, известного как плагиат?Или есть какой-то другой инструмент, который вы могли бы порекомендовать для этого

Ответы [ 5 ]

3 голосов
/ 21 января 2012

Зачем вообще использовать git? Простой, но эффективный метод состоит в том, чтобы сравнить размеры различий между всеми различными представлениями, а затем вручную проверить и сравнить их с наименьшими различиями.

2 голосов
/ 21 января 2012

Мох - это инструмент, разработанный Stanford CS prof. Я думаю, что они используют это там же. Это как diff для исходного кода.

1 голос
/ 21 января 2012

Добавляя к другим ответам, вы можете использовать diff - но я не думаю, что ответы будут настолько полезны сами по себе. То, что вы хотите, это количество совпадающих строк, минус количество непустых строк, и чтобы получить это автоматически, вам нужно приложить немало усилий с помощью wc -l и grep, чтобы вычислить сумму длин файлы, минус длина файла сравнения, минус количество пустых строк, которые diff включены как соответствующие. И даже тогда вы пропустите некоторые случаи, когда diff решал, что идентичные строки не совпадают из-за того, что перед ними вставлены разные вещи.

Гораздо лучшим вариантом является одно из предложений, перечисленных в https://stackoverflow.com/questions/5294447/how-can-i-find-source-code-copying (или в https://stackoverflow.com/questions/4131900/how-to-detect-plagiarized-code,, хотя ответы, похоже, дублируются).

1 голос
/ 21 января 2012

Вы можете использовать diff и проверить, похожи ли эти два файла на :

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

Эти параметры говорят diff игнорировать изменения пробелов и вносить git -как diff файл.Попробуйте на двух примерах.

0 голосов
/ 30 декабря 2015

Использование diff абсолютно не хорошая идея, если только вы не хотите отправиться в царство комбинаторного ада:

  • Если у вас есть 2 представления, вы должны выполнить 1 проверку, чтобы проверить плагиат,
  • Если у вас есть 3 представления, вы должны выполнить 2 сравнения, чтобы проверить на плагиат,
  • Если у вас есть 4 представления, вы должны выполнить 6 различий для проверки на плагиат,
  • ...
  • Если у вас есть n представлений, вы должны выполнить (n-1)! diff!

С другой стороны, Мосс , уже предложенный в другом ответе, использует совершенно другой алгоритм . По сути, он вычисляет набор отпечатков пальцев для значительных килограммов каждого документа. Отпечаток пальца фактически является хешем, используемым для классификации документов, и возможный плагиат обнаруживается, когда два документа в конечном итоге сортируются в одном и том же сегменте.

...