Получите разницу между двумя репо ИЛИ получите только строки из последних X коммитов - PullRequest
1 голос
/ 28 октября 2019

Контекст

Поэтому я пытаюсь использовать MOSS , чтобы сравнить репо студента с полной справочной реализацией, которая (к сожалению) общедоступна.

Что мысделать это дать студентам базовое репо, а затем они раскошелиться и реализовать свой собственный код. Проблема в том, что законченные репо прошлых лет находятся в сети.

Текущая ситуация

Пока я проверял их репо на предмет мошенничества следующим образом:

  1. Клонируйте их репо на моей машине

  2. Запустите мох для всех файлов в своем репо против полной реализации онлайн

  3. Просеять через каждыйблокировать потенциальное совпадение и посмотреть, действительно ли это мошенничество или ложное срабатывание * (см. ниже)

Проблема:

Проблема в том, что основной коднастолько массивен, что по крайней мере 60% любой реализации совпадают с эталонной реализацией. Если я вижу что-то более высокое, я должен отдельно проверить каждый блок кода, чтобы увидеть, является ли он частью базового кода. Иногда я даже не могу вспомнить, является ли это базовый код или нет, поэтому я трачу больше времени на его проверку. Весь этот процесс занимает слишком много времени, и класс очень быстро расширяется, поэтому становится невозможным делать это вручную для каждого ученика.

Мой вопрос:

Есть ли способ, еслиbase_repo (тот, который мы даем студентам), чтобы сделать что-то, эквивалентное разнице в наборе:

student_repo = student_repo - base_repo

или, по крайней мере, если история коммитоврепо что-то вроде:

commit c005 - "student commit finished assignment!"
commit c004 - "student commit finished second step"
commit c003 - "student first commit: finished first step"
commit c002 - "instructor base_code complete!"
commit c001 - "instructor base_code commit2"
commit c000 - "instructor base_code commit1"

Могу ли я получить все строки, которые были не из коммитов c000 - c002? (чтобы увидеть только все, что добавили студенты)

Если у меня есть для этого методика, я также могу сделать то же самое с онлайн-репозиториями, из-за которых студенты могут обманывать, и сравнить двав Мосс.

Таким образом, я не получу никаких ложных срабатываний в моих результатах MOSS и могу легко определить, скопировал ли ученик код.

Ответы [ 2 ]

0 голосов
/ 28 октября 2019

Можно сделать что-то подобное. На данный момент я предполагаю, что ваш базовый репозиторий всегда использует один и тот же контент, и что последний коммит в вашем базовом репозитории (при сокращении) равен c002.

Когда вы клонируете каждый репозиторий, вы можете сгенерироватьразница между исходным кодом и кодом студента с git diff c002. Это покажет вам изменения (с учетом контекста), характерные для реализации этого пользователя и отличающиеся стандартным форматом diff.

Если вам буквально нужны только строки, которые добавляются, изменяются и удаляются, вы можете передать-U0 и git diff не будут использовать строки контекста. Удаления все еще будут присутствовать, хотя;Вы можете использовать что-то вроде следующего:

git diff -U0 c002 | perl -ne 'unless (/^diff --git/../^@@/) { print if /^\+/; }'

Это будет включать только строки сложения.

0 голосов
/ 28 октября 2019

Если у вас установлен Git CMD, вы можете получить полный журнал через:

git log master

Наиболее близким к тому, что вы хотите сделать, будет:

git log master --oneline
fc9c000 added some contextual information
1527000 2019-09-14 20:08:05 - Update
3e40000 2019-09-14 19:00:37 - Update
e800000 2019-09-14 18:55:40 - Tidy some parts of the code.

Этот форматдаст вам хэш, автора и сводку для каждого коммита и сохранит в csv (для windows):

git log master --pretty=tformat:"%h,%an,\"%s\"" > log.csv

Если вы хотите увидеть полный список выходных данных и форматов, взгляните на эту страницу: https://git -scm.com / документы / довольно-форматов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...