因此,我尝试使用MOSS将学生的回购交易与(不幸的是)公开提供的完整参考实现进行比较。
我们要做的是给学生一个基本的仓库,然后他们从仓库中分叉并实现自己的代码。问题是,前些年的已完成回购在网上都可以。
到目前为止,我一直在检查他们的仓库是否作弊的方式如下:
在他们的机器上克隆他们的仓库
在存储库中的所有文件上运行moss,而不是在线完整实施
筛选每个可能的匹配块,看是否它实际上是在作弊,或者是假阳性*(请参阅下文)
问题是,因为基本代码非常庞大,所以任何实现中至少有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
中获得所有不是来自行的行吗? (以查看only学生添加的所有内容)
[如果我有这样做的技巧,我也可以对在线回购做同样的事情,因为学生可能会从中欺骗并在MOSS中比较两者。
这样,我不会在MOSS结果中得到任何误报,并且可以轻松判断学生是否复制了代码。
如果安装了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/docs/pretty-formats
可以做这样的事情。现在,我假设您的基础存储库始终使用相同的内容,并且基础存储库中的最后一次提交(缩写)为c002
。
克隆每个存储库时,您可以使用git diff c002
在原始代码和学生代码之间生成差异。这将向您显示特定于该用户实现的更改(带有上下文),并且在标准diff格式中有所不同。
如果您只希望添加,更改和删除行,则可以传递-U0
,并且git diff
将不使用任何上下文行。但是,删除仍将存在;您可以使用类似以下的内容:
git diff -U0 c002 | perl -ne 'unless (/^diff --git/../^@@/) { print if /^\+/; }'
将仅包括加法行。