[发明专利]用于快速全网代码溯源检测的代码库设计方法及检测方法在审
申请号: | 202110278117.6 | 申请日: | 2021-03-10 |
公开(公告)号: | CN112988217A | 公开(公告)日: | 2021-06-18 |
发明(设计)人: | 周明辉;高恺;何昊 | 申请(专利权)人: | 北京大学 |
主分类号: | G06F8/70 | 分类号: | G06F8/70;G06F8/71 |
代理公司: | 北京万象新悦知识产权代理有限公司 11360 | 代理人: | 黄凤茹 |
地址: | 100871*** | 国省代码: | 北京;11 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 用于 快速 代码 溯源 检测 设计 方法 | ||
1.一种用于快速全网代码溯源检测的代码库设计方法,通过项目发现、数据提取、数据存储、代码信息映射构建和数据更新过程,针对全网使用Git开源项目内的Git对象进行高效存储而得到代码库,并实现代码库的高效更新;
包括:采用按Git对象分类型分块存储的存储模式;构建代码文件到代码文件信息之间的关系映射,对代码文件的全网信息进行快速检索;对构建的超大规模的代码库采用高效更新方式,基于Libgit2函数库提出定制化的git fetch协议,以构建的超大规模的代码库为后端,高效获得远程仓库的新增的Git对象数据;
具体包括如下步骤:
A.利用一台服务器,通过多种项目发现方法获取全网开源软件项目列表,并将项目发现过程的脚本打包进docker镜像中;
B.数据提取:将步骤A获取的开源项目列表中的项目下载到本地并提取其中的Git对象;所述提取在服务器集群上多线程并行完成;
C.Git对象数据存储:按照Git对象类型分类型分块存储,降低数据存储空间,提高并行处理效率;具体包括:
a.不保存开源项目包括的二进制文件;
b.按照Git对象类型对Git对象数据进行分类型存储,即数据库的类型包括commit数据库、tree数据库、blob数据库和tag数据库,使得数据存储空间降至百TB级别,同时还能够快速地检索数据是否保存在代码库中;
c.每类Git对象的数据库包括缓存数据和内容数据,分别保存在缓存数据库和内容数据库中,加快检索速度;将每类数据库包含的缓存数据库和内容数据库分成多份用于并行;缓存数据库用于快速确定某个Git对象是否已经存储在数据库中,并且是数据提取所必需的;如果某个Git对象存在数据库中,即不提取该Git对象;缓存数据库还用于确定是否需要克隆一个仓库;如果一个仓库的head指向的commit对象已经在缓存数据库中,即不需要克隆;
d.缓存数据库为键值数据库;内容数据库采用拼接的方式保存,以方便更新;
缓存数据库中的键为Git对象的SHA1值,缓存数据库中的值为利用Perl的compress库压缩后的该Git对象在内容数据库中的偏移位置和大小;
内容数据库包含连续拼接在一起的Git对象的压缩后的内容;内容数据库采用拼接的方式保存,只需将新的内容拼接到对应的文件末尾;
分别对commit和tree对象另创建一个随机查找键值数据库,其中键是Git对象的SHA1,值是对应Git对象的压缩内容;
e.利用SHA1值将各类型的数据库分割成多份,实现并行化加速;
f.使用以哈希作为索引的数据库TokyoCabinet;
D.以commit为中心,构建代码信息关系的映射;包括:代码文件到包含它的项目、代码文件到包含它的commit、代码文件到它的作者、代码文件到它的文件名、代码文件到它的创建时间的关系映射;利用TokyoCabinet数据库通过分块存储方式保存这些关系映射,以进行快速检索;
E.获取新的Git对象,对代码库进行数据更新;包括两种方法:
a.识别新的Git项目,进行克隆,再提取其中的Git对象;
b.通过获取已收集仓库的远程仓库的分支的最新的commit来识别更新的项目,再通过修改git fetch的步骤,使得在没有本地Git仓库时,以构建的代码库为后端,获取远程仓库的新增的Git对象,并提取出新增的Git对象到代码库中;具体包括以下步骤:
b1)将远程仓库添加到本地仓库中;在Libgit2中用git_remote结构体来表示远程仓库,
在创建该结构体时,将本地仓库.git/refs/heads文件夹内的所有分支引用填充到该结构体内的一个成员变量ref中;
b2)建立本地仓库到远程仓库的连接;
b3)建立连接后,远程仓库进行回复respond,将远程仓库的所有的分支引用即.git/refs/heads文件夹内的内容,发送到本地;
将远程仓库发回的分支引用保存到本地,判断这些分支引用是否保存在本地代码库中,如果存在,说明远程仓库无更新,如果不存在说明远程仓库有更新,进入下一步;
b4)本地仓库接收到远程仓库发回的引用后,逐个检查这些引用指向的对象是否在本地仓库中;如果在本地仓库中,即进行标记,表明不需要请求远程仓库发送更新,再将这些引用插入到成员变量中;
b5)本地仓库对commit排序,将该成员变量包括标记过的引用发回到远程仓库,与远程仓库进行谈判;本地等待远程仓库发回的ACK信号;具体地,每次都发送主分支最新的commit对象,重复执行多次,直到收到远程仓库的ACK信号;
b6)与远程仓库谈判完毕后,远程仓库可计算出要发回到本地的Git对象;远程仓库将这些对象打包成packfile格式的文件,发回本地;
将远程仓库发回的packfile格式的文件保存到本地,依据代码库中的Git对象解析packfile文件;
通过上述对git fetch进行修改后的步骤,使得git fetch以构建的代码库为后端进行更新,不需要每次更新都需要克隆完整的仓库,同时减少网络带宽开销和时间开销。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于北京大学,未经北京大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/202110278117.6/1.html,转载请声明来源钻瓜专利网。
- 上一篇:一种服装表演用衣物陈列架
- 下一篇:一种房屋隔音降噪器