一种用Git原生Clone命令克隆指定Commit的方法技术

技术编号:24937319 阅读:648 留言:0更新日期:2020-07-17 20:48
本发明专利技术提供了一种用Git原生Clone命令克隆指定Commit的方法,包括以下步骤:(1)当用户通过用户原生Git客户端向Git原生服务器发送普通Git命令时,首先用户通过用户原生Git客户端向Git原生服务器发送普通Git clone命令或者其他git命令;(2)用户命令拦截器拦截用户命令,若发现用户命令为普通git命令,则不做任何额外处理,并将用户命令发送给Git原生服务器;(3)Git原生服务器接收用户命令,并将返回信息按照原路径返回至用户原生Git客户端;本发明专利技术提供一种可以克隆Git指定Commit的方法,大幅提升在只需要单commit场景下的clone(克隆)效率。

【技术实现步骤摘要】
一种用Git原生Clone命令克隆指定Commit的方法
本专利技术涉及一种克隆指定Commit的方法,具体是一种用Git原生Clone命令克隆指定Commit的方法。
技术介绍
Git目前已经成为全球最为广泛使用的分布式版本控制系统,用户可以通过客户端向服务器端提交(Push)或者下载(Clone/Pull/fetch)代码。用户的代码变更以commit粒度作为一次变更历史,每次客户端向服务器端提交提交(Push)或者下载(Clone/Pull/fetch)代码可以包含若干个commit。其中Gitclone命令默认是下载服务器端的整个代码提交历史。Gitpull和Gitfetch命名是在客户端已经通过gitclone命令获取了服务器端代码的基础上,进行差异部分的增量下载。但是在一些场合,例如大型分布式构建系统,每次进行代码构建时,因为不可能在构建机器上把所有代码库全部都先gitclone缓存起来之后再进行gitpull/fetch进行增量下载。所以在构建时,需要直接使用gitclone命令进行代码下载。这样的话,虽然实际代码构建仅需要某个指定commit的代码,但是需要把代码库的全部历史下载下来,效率非常低。Git原生Clone命令:为了提升gitclone(克隆)命令的效率,gitclone提供了浅克隆的方法,具体方式为通过--depth参数指定克隆深度,例如:gitclone--depth=10表示只克隆最后的10个commit,能在一定程度上避免clone全部代码历史的巨大浪费。但是,Git原生克隆命令只能clone(克隆)最新的若干个提交历史(commit),不能对指定的单个提交历史(commit)进行clone(克隆)。例如对于自动化构建系统,因为需要对非最新的代码历史进行重新构建,浅克隆的深度无法确定,所以无法解决此问题。且浅克隆也是把最新的若干次历史全部克隆下来,不能精确对指定的单个提交历史(commit)进行精确clone(克隆),也存在效率浪费。国外厂商Github/谷歌Gerrit:提供了gitfetch指定commit的方式下载指定commit。但是,使用gitfetch命令,需要用户先在本地通过gitinit初始化一个代码库,然后通过gitremoteaddorigin命令添加远程仓库,最后通过gitfetch进行下载三个步骤,命令繁琐,学习成本较高。
技术实现思路
本专利技术的目的在于提供一种用Git原生Clone命令克隆指定Commit的方法,以解决上述
技术介绍
中提出的问题。为实现上述目的,本专利技术提供如下技术方案:一种用Git原生Clone命令克隆指定Commit的方法,包括用户原生Git客户端和Git原生服务器,在用户原生Git客户端与Git原生服务器之间设置用户命令拦截器;具有以下步骤:(1)当用户通过用户原生Git客户端向Git原生服务器发送普通Git命令时,首先用户通过用户原生Git客户端向Git原生服务器发送普通Gitclone命令或者其他git命令;(2)用户命令拦截器拦截用户命令,若发现用户命令为普通git命令,则不做任何额外处理,并将用户命令发送给Git原生服务器;(3)Git原生服务器接收用户命令,并将返回信息按照原路径返回至用户原生Git客户端;(4)当用户通过用户原生Git客户端向Git原生服务器发送包含指定commit信息的gitclone--depth=1命令,假设commitID为A,其中A表示一个40位的真实commitID值;commit信息可以在代码库URL中以特殊标志携带,或者gitclone命令后续版本支持服务器端参数-server-option之后,通过此参数指定;(5)用户命令拦截器解析到用户的gitclone--depth=1命令,并解析出其中的40位commitID信息A;(6)用户命令拦截器向git原生服务器查询该commitA是否存在;(7)Git原生服务器向用户命令拦截器返回查询结果;(8)如果该commitA不存在,用户命令拦截器向用户原生Git客户端返回错误信息,流程结束;(9)如果该commitA存在,步骤(6)在查询操作完成后,不再进行正常的git对象清点来找出最新的commit信息,而是伪造清点结果,直接答复用户原生Git客户端,最新的commit就是用户指定的commitA;(10)按照gitclone命令的通信协议,gitclone命令接收到步骤(9)返回的信息,获知Git原生服务器中最新commit的就是commitA,然后会向Git原生服务器发送真正的下载请求,并且在下载请求中告诉Git原生服务器,用户原生Git客户端本地have0commit,wantcommitA,depth=1其中have和want是gitclone命令通信协议中的数据报文字段;(11)用户命令拦截器收到步骤(10)中的用户原生Git客户端请求,向Git原生服务器发送数据打包命令,并且强制设定打包深度depth=1,将commitA的代码数据单独打包;(12)用户命令拦截器收到commitA的代码数据包,并且将后数据包回传至用户原生Git客户端。(13)用户原生Git客户端接收到步骤(12)中回传的数据,下载了commitA,并且只有A一个commit;由于在步骤(4)中gitclone使用了--depth=1参数,故commitA数据可通过用户原生Git客户端数据检验。与现有技术相比,本专利技术的有益效果是:本专利技术提供一种可以克隆Git指定Commit的方法,大幅提升在只需要单commit场景下的clone(克隆)效率;本方法使得git原生clone命令具备clone指定commit的能力,在只需要单个commit文件内容的场景,大幅度提升gitclone的效率。通过在用户原生Git客户端和Git原生服务器之间增加用户命令拦截器进行命令截获及数据修改,使用git原生clone命令及参数实现对任意指定的代码历史进行下载,用户命令拦截器通过伪造最新commit信息,从而达到欺骗gitclone命令的目的,让gitclone命令误以为服务器端最新commit为指定的commit;对指定commit数据进行打包时,强制设置打包深度为1,只进行单commit数据打包。附图说明图1为一种用Git原生Clone命令克隆指定Commit的方法的整体技术示意图。图2为一种用Git原生Clone命令克隆指定Commit的方法中工作流程。具体实施方式下面结合具体实施方式对本专利的技术方案作进一步详细地说明。请参阅图1-2,一种用Git原生Clone命令克隆指定Commit的方法,包括用户原生Git客户端和Git原生服务器,在用户原生Git客户端与Git原生服务器之间设置用户命令拦截器,用户原生Git客户端用以发送git命令,用户命令拦截器用以对用户命令进行处理本文档来自技高网
...

【技术保护点】
1.一种用Git原生Clone命令克隆指定Commit的方法,其特征在于,包括用户原生Git客户端和Git原生服务器,在用户原生Git客户端与Git原生服务器之间设置用户命令拦截器;具有以下步骤:/n(1)当用户通过用户原生Git客户端向Git原生服务器发送普通Git命令时,首先用户通过用户原生Git客户端向Git原生服务器发送普通Git clone命令或者其他git命令;/n(2)用户命令拦截器拦截用户命令,若发现用户命令为普通git命令,则不做任何额外处理,并将用户命令发送给Git原生服务器;/n(3)Git原生服务器接收用户命令,并将返回信息按照原路径返回至用户原生Git客户端;/n(4)当用户通过用户原生Git客户端向Git原生服务器发送包含指定commit信息的gitclone--depth=1命令,假设commit ID为A,其中A表示一个40位的真实commit ID值;commit信息可以在代码库URL中以特殊标志携带,或者git clone命令后续版本支持服务器端参数-server-option之后,通过此参数指定;/n(5)用户命令拦截器解析到用户的git clone--depth=1命令,并解析出其中的40位commit ID信息A;/n(6)用户命令拦截器向git原生服务器查询该commit A是否存在;/n(7)Git原生服务器向用户命令拦截器返回查询结果;/n(8)如果该commit A不存在,用户命令拦截器向用户原生Git客户端返回错误信息,流程结束;/n(9)如果该commit A存在,步骤(6)在查询操作完成后,不再进行正常的git对象清点来找出最新的commit信息,而是伪造清点结果,直接答复用户原生Git客户端,最新的commit就是用户指定的commit A;/n(10)按照git clone命令的通信协议,git clone命令接收到步骤(9)返回的信息,获知Git原生服务器中最新commit的就是commit A,然后会向Git原生服务器发送真正的下载请求,并且在下载请求中告诉Git原生服务器,用户原生Git客户端本地have 0commit,wantcommit A,depth=1其中have和want是git clone命令通信协议中的数据报文字段;/n(11)用户命令拦截器收到步骤(10)中的用户原生Git客户端请求,向Git原生服务器发送数据打包命令,并且强制设定打包深度depth=1,将commit A的代码数据单独打包;/n(12)用户命令拦截器收到commit A的代码数据包,并且将后数据包回传至用户原生Git客户端。/n(13)用户原生Git客户端接收到步骤(12)中回传的数据,下载了commit A,并且只有A一个commit;由于在步骤(4)中git clone使用了--depth=1参数,故commit A数据可通过用户原生Git客户端数据检验。/n...

【技术特征摘要】
1.一种用Git原生Clone命令克隆指定Commit的方法,其特征在于,包括用户原生Git客户端和Git原生服务器,在用户原生Git客户端与Git原生服务器之间设置用户命令拦截器;具有以下步骤:
(1)当用户通过用户原生Git客户端向Git原生服务器发送普通Git命令时,首先用户通过用户原生Git客户端向Git原生服务器发送普通Gitclone命令或者其他git命令;
(2)用户命令拦截器拦截用户命令,若发现用户命令为普通git命令,则不做任何额外处理,并将用户命令发送给Git原生服务器;
(3)Git原生服务器接收用户命令,并将返回信息按照原路径返回至用户原生Git客户端;
(4)当用户通过用户原生Git客户端向Git原生服务器发送包含指定commit信息的gitclone--depth=1命令,假设commitID为A,其中A表示一个40位的真实commitID值;commit信息可以在代码库URL中以特殊标志携带,或者gitclone命令后续版本支持服务器端参数-server-option之后,通过此参数指定;
(5)用户命令拦截器解析到用户的gitclone--depth=1命令,并解析出其中的40位commitID信息A;
(6)用户命令拦截器向git原生服务器查询该commitA是否存在;
(7)Git原生服务器向用户命令拦截器返回查询结果;
(8)如...

【专利技术属性】
技术研发人员:刘庆
申请(专利权)人:北京简单一点科技有限公司
类型:发明
国别省市:北京;11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1