获得两个存储库之间的差,或者仅获得最后X次提交中的行

问题描述 投票:0回答:2

上下文

因此,我尝试使用MOSS将学生的回购交易与(不幸的是)公开提供的完整参考实现进行比较。

我们要做的是给学生一个基本的仓库,然后他们从仓库中分叉并实现自己的代码。问题是,前些年的已完成回购在网上都可以。

当前状况

到目前为止,我一直在检查他们的仓库是否作弊的方式如下:

  1. 在他们的机器上克隆他们的仓库

  2. 在存储库中的所有文件上运行moss,而不是在线完整实施

  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中获得所有不是来自行的行吗? (以查看only学生添加的所有内容)

[如果我有这样做的技巧,我也可以对在线回购做同样的事情,因为学生可能会从中欺骗并在MOSS中比较两者。

这样,我不会在MOSS结果中得到任何误报,并且可以轻松判断学生是否复制了代码。

git github
2个回答
0
投票

如果安装了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


0
投票

可以做这样的事情。现在,我假设您的基础存储库始终使用相同的内容,并且基础存储库中的最后一次提交(缩写)为c002

克隆每个存储库时,您可以使用git diff c002在原始代码和学生代码之间生成差异。这将向您显示特定于该用户实现的更改(带有上下文),并且在标准diff格式中有所不同。

如果您只希望添加,更改和删除行,则可以传递-U0,并且git diff将不使用任何上下文行。但是,删除仍将存在;您可以使用类似以下的内容:

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

将仅包括加法行。

© www.soinside.com 2019 - 2024. All rights reserved.