2012-01-21 23 views
6

Lo siento si esto es fuera de tema, pero aquí es su oportunidad de reducir la cantidad de preguntas "tareas" en este sitio :-)¿Puede detectar Git si dos archivos fuente son esencialmente copias de los demás?

estoy enseñando una clase de programación C, donde los estudiantes trabajan en una pequeña biblioteca de rutinas numéricas en C. Este año, los archivos fuente de varios grupos de estudiantes tenían cantidades significativas de duplicación de código en ellos.

(abajo a mal escrito de forma idéntica printf instrucciones de depuración. Me refiero a lo tonto puede ser.)

Sé que Git puede detectar cuando dos archivos de origen son similares a los demás más allá de un cierto umbral, pero nunca gestor para que funcione en dos archivos fuente que no están en un repositorio de Git.

Tenga en cuenta que estos no son estudiantes especialmente sofisticados. Es poco probable que se tomaran la molestia de cambiar los nombres de variable/función.

¿Hay alguna manera de que pueda usar Git para detectar la duplicación de código significativa y literal, a.k. un plagio? ¿O hay alguna otra herramienta que podría recomendar para eso?

+2

Git probablemente no sea la herramienta adecuada para esto. Hay herramientas de detección de plagio de código disponibles, estoy seguro de que una búsqueda podría aparecer algo. –

+2

En mi experiencia, las diferencias simples son lo suficientemente buenas. En particular, los comentarios idénticos son un gran regalo. Es increíble el poco esfuerzo que ponen en hacer trampa ... –

Respuesta

3

¿Por qué utilizar git en absoluto? Una técnica simple pero efectiva sería comparar los tamaños de las diferencias entre todas las presentaciones diferentes, y luego inspeccionar manualmente y comparar aquellas con las diferencias más pequeñas.

1

Usted podría utilizar diff y comprobar si los dos archivos parecen similares:

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

Esas opciones dicen diff para ignorar los cambios de espacio en blanco y hacer un archivo git -como diff. Pruébalo en dos muestras.

+0

Observe cómo la diferencia en el número de '<'s and '>'s siempre es igual a la diferencia en el número de líneas en los archivos, independientemente de su similitud. :) –

+0

No, no siempre. El espacio en blanco se excluye con '-w'. – Blender

2

Moss es una herramienta desarrollada por un Stanford CS prof. Creo que lo usan allí también. Es como diff para el código fuente.

1

Agregando a las otras respuestas, podría usar diff - pero no creo que las respuestas sean tan útiles por sí mismas. Lo que quiere es el número de líneas que coinciden, menos el número de líneas que no están en blanco, y para obtenerlo automáticamente necesita hacer un poco de magia con wc -l y grep para calcular la suma de las longitudes de los archivos, menos la longitud del archivo diff, menos el número de líneas en blanco que diff incluido como coincidencia. E incluso entonces omitirá algunos casos en los que diff decidió que las líneas idénticas no coincidían debido a diferentes elementos insertados antes de ellas.

Una opción mucho mejor es una de las sugerencias enumeradas en https://stackoverflow.com/questions/5294447/how-can-i-find-source-code-copying (o en https://stackoverflow.com/questions/4131900/how-to-detect-plagiarized-code, aunque las respuestas parecen duplicarse).

0

El uso de diff es absolutamente no una buena idea a menos que desee adentrarse en el reino del infierno combinatoria:

  • Si usted tiene 2 presentaciones, usted tiene que realizar 1 diff para comprobar si hay plagio,
  • Si usted tiene 3 presentaciones, usted tiene que realizar 2 diff para comprobar si hay plagio,
  • Si tiene 4 presentaciones, usted tiene que realizar de 6 diff para comprobar si hay plagio,
  • ...
  • Si tiene n presentaciones, debe realizar (n-1)! diff!

Por otro lado, Moss, ya se ha sugerido en otra respuesta, utiliza un completely different algorithm. Básicamente, calcula un conjunto de huellas dactilares para k-gramas significativos de cada documento. La huella digital es, de hecho, un hash utilizado para clasificar documentos, y se detecta un posible plagio cuando se clasifican dos documentos en el mismo cubo.

Cuestiones relacionadas