☰
怎么给仓库做代码查重:从建任务到看出重复函数
2026/11/1 1:58:45 网站建设 项目流程

这篇讲怎么查一个仓库里的代码和其他项目重复了多少。看完你可以建一个代码溯源任务,选好要检查的仓库和拿来比对的仓库,设好相似度阈值,从重复率、相似度分档看到具体重复的文件和函数。

两个说法会贯穿全文:溯源目标是你要检查的代码,这里用的是一个仓库;被溯源仓库是拿来跟它比对的仓库,一次最多选 50 个。

代码溯源在团队版和企业版中提供;社区版没有溯源菜单。

对照时以已经跑完的任务fixture: source vs dup (repo)为例:溯源目标是仓库 xlliu/test-trace-source-example,被溯源仓库是 xlliu/test-trace-dup-example。溯源列表页上另外三条任务用的是同一套示例数据,分别是以文件InvoicePriceCalculator为目标、以函数calculateInvoiceTotal为目标,以及和 xlliu/test-trace-unique-example 做的对照。

1. 创建任务

  1. 打开代码溯源

    在侧栏点高级 → 溯源,进入标题为代码溯源的页面,再点右上角的创建溯源,打开一个分四步的创建向导。

  2. 第 1 步:基本信息

    溯源名称必填,写清这次查的是什么,例如「source vs dup 查重」;溯源描述可以不填。

  3. 第 2 步:选择目标

    溯源目标有仓库、文件、代码块、函数四种。要查整个仓库就选仓库,本例选的是test-trace-source-example,分支可以不选。下方的去重重复文件开关会自动识别并排除重复的文件,一般保持默认即可。

  4. 第 3 步:设置检查语言和相似度阈值

    这一步在界面上的标题是配置参数。检查语言保持不勾选,界面说明是「不选将自动检查对比所有语言」。相似度阈值有两个:文件相似度阈值默认 80%,代码块相似度阈值默认 90%。第一次运行先用默认值。

  5. 第 4 步:选择被溯源仓库

    这一步在界面上的标题是选择仓库。在搜索框里找到test-trace-dup-example,点添加,右上角会显示已选数量,例如1 / 50。注意不要误选名字带-Fork的同名仓库。下方的配置摘要汇总了前面所有的选择,核对一遍再继续。

  6. 创建并执行

    点创建并执行,任务创建后马上开始运行。如果只点创建,任务会停在等待中,之后要在列表里点开始溯源才会运行。

2. 几个参数怎么选

第 3 步和高级配置里的参数,大多数情况下保持默认就行。下表列出每个参数的默认值,以及什么时候需要改:

参数默认什么时候改
检查语言不勾选,检查所有语言一般不用改,只想看某一种语言时再勾选
文件相似度阈值80%想看更多「有点像」的文件就调低;只想看几乎一样的就调高
代码块相似度阈值90%同上,作用在代码片段上
文件编码UTF-8老项目源码是 GBK 编码时,改成 GBK
忽略标识符差异关闭怀疑有人复制代码后改了变量名、函数名时打开
忽略字面量差异关闭想找出字符串、数字不同但逻辑一样的代码时打开
启用仓库缓存启用同一批仓库要反复查时保持打开

其中两项需要多说一句。文件编码要和源码的实际编码一致:如果 GBK 编码的源码仍按 UTF-8 读取,中文注释会变成乱码,影响比对结果。启用仓库缓存打开时,下次检查同一批仓库不用重新克隆代码;关掉之后,任务结束时会删除这次克隆下来的代码。

阈值滑块每次调整 5%。建议先用默认值跑一次,看过结果再决定调高还是调低。如果一开始就把阈值调得很低,结果会非常多,反而不好找重点。

另外,以.开头的目录、node_modules和target不参与比对,目前也没有设置其他排除目录的选项。

3. 等任务跑完

在任务列表里,任务的状态会依次经过等待中、运行中、已完成;执行出错会变成失败,被手动停止则显示已取消。运行中的任务可以点停止溯源中止。

耗时取决于仓库大小和被溯源仓库的数量:仓库越大、选的仓库越多,跑得越久。任务运行期间可以离开页面,稍后回来再看。

4. 看结果:从整体到具体的函数

任务变成已完成后,点查看详情进入详情页。详情页有溯源结果和执行日志两个页签,下面按从整体到具体的顺序看溯源结果。

先看整体数字。顶部依次是溯源仓库数、溯源文件数、代码行数、重复率和唯一率。重复率只是一个整体提示:同一个团队的项目常用相同的框架和模板,本来就会有一部分相似代码,所以重复率不为零很正常。

再看分档。每处匹配按相似度分进五档:完全相同(95–100%)、高度相似(80–95%)、中等相似(60–80%)、低度相似(40–60%)和唯一代码(0–40%)。最值得看的是完全相同和高度相似这两档。

然后看具体的匹配。结果列表可以按相似度排序,让最像的排在最前面;在「搜索仓库或文件…」框里输入目录或文件名,可以只看相关的匹配。每条匹配会显示两边的文件和相似度分数,点对比代码就能展开两边的代码,有两种视图:

  • 并排对比:左边是源文件,右边是溯源文件,适合看两段代码的整体结构。
  • 统一视图:上下排列,适合看细小的差别。

以source vs dup为例,结果里没有完全相同的匹配,两条都落在高度相似。点开InvoicePriceCalculator.java的对比代码,在并排对比里可以看到左右两边都是public class InvoicePriceCalculator,相似度分数是 86.86%。

最后逐条判断。看到重复代码后,先弄清楚它为什么重复,再决定怎么处理。常见的有三种情况:

看到的情况重复原因建议处理方式
框架生成的代码、配置模板脚手架或统一模板生成正常重复,不用处理
几个项目里各复制了一份的工具函数历史复制粘贴考虑抽成公共模块,通过拉取请求重构
不该出现在这里的业务代码跨项目误拷或违规复用找相关负责人确认来源和是否需要删除

5. 导出和重新运行

导出报告。在任务上点导出报告,选好导出格式和导出范围(全部结果,或当前已加载的结果)。格式有PDF (HTML)、Excel、JSON和Markdown四种,想先看效果可以点预览报告。其中有两点要注意:PDF (HTML)导出的是一个 HTML 文件,用浏览器打开后再打印成 PDF;Excel目前导出的内容是 CSV 格式,用 Excel 打开时可能提示格式与扩展名不一致,所以需要表格时,建议先导出 Markdown 或 JSON 再转换。

重新运行。代码有了新提交、想再查一次时,点重新溯源。只有等待中的任务可以修改参数;已经跑过的任务如果想换参数,新建一个任务会更清楚。

6. 跑不出结果时怎么排查

任务失败或结果不对劲时,可以按下表对照排查:

你看到的原因怎么处理
侧栏没有溯源菜单社区版不包含代码溯源,或当前账号没有代码溯源权限确认版本;或请管理员开通权限(见表后)
第 4 步不能继续,提示「请至少选择一个被溯源仓库」没有添加被溯源仓库至少添加一个
状态变成失败执行中出错,例如拉取某个仓库的代码失败打开执行日志看具体原因
已完成,但几乎没有匹配阈值太高,或者两边确实不像两个阈值各调低 10%,新建任务再跑一次
勾选了某种语言后结果为空语言筛选和仓库里的实际文件对不上检查语言不勾选,检查所有语言
中文注释附近的比对结果很奇怪源码不是 UTF-8 编码文件编码改成 GBK 后重新创建任务

如果是权限问题,请管理员在成员权限里打开代码溯源这一项,它的说明是「允许使用代码溯源进行代码查重」。

常见问题

能不能推送代码后自动查重?

不能。代码溯源每次都需要手动创建并开始任务,推送代码和拉取请求都不会触发它。

想查一段代码在哪些仓库里出现过,怎么做?

在第 2 步把溯源目标设为代码块或函数,填写名称并把代码粘进去:代码块建议至少 10 行,函数要包含完整的定义和实现。然后在第 4 步选上要查的被溯源仓库即可。

比对的是被溯源仓库的哪个分支?

被溯源仓库比对的是各自的默认分支;目标仓库的分支则在第 2 步里选择。

小结

给仓库做代码查重,就是在高级 → 溯源点创建溯源,按四步建一个溯源任务:填写名称;选择目标仓库和分支;检查语言不勾选,相似度阈值先用默认的 80% 和 90%;添加 1 到 50 个被溯源仓库。点创建并执行后等任务完成,在查看详情里先看重复率,再看完全相同和高度相似两档,对排在前面的匹配点对比代码逐条判断要不要处理。需要留档时用导出报告,其中 PDF (HTML) 和 Markdown 最省事。代码溯源在团队版和企业版中提供,社区版没有溯源菜单。

结论:在高级 → 溯源 → 创建溯源选定目标仓库和 1–50 个被溯源仓库(相似度阈值先用默认的 80%/90%),任务完成后在详情页按相似度排序,点对比代码核对具体的重复片段。

参考文章

  • AngusGit 手册:代码溯源
  • 代码溯源是什么:在仓库里查相似代码,不是需求从哪来
  • 在合并请求里做完代码评审:看 Diff、写行评、通过或打回

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询