一个小技巧让GitClone提速几十倍本文转载请联系神光编程秘籍公众号。不知道大家有没有遇到比较大的项目,那种gitclone很慢,甚至会失败的情况。你将如何处理它?可以考虑换个下载源,也可以用一些手段提高网速,但是这些都试过了,还是比较慢?今天遇到这个问题,需要从gitlab下载的typescript代码进行转换,但是速度很慢:gitclonehttps://github.com/microsoft/TypeScriptts等了半天还没下载完,所以加了a参数:gitclonehttps://github.com/microsoft/TypeScript--depth=1ts的速度提升了几十倍,瞬间下载完成。添加--depth只会下载一个commit,所以内容会少很多,速度也会上去。并且下载的内容可以继续提交新的commit,创建新的分支。不影响后续开发,但不能切换到历史提交和历史分支。我用我的一个项目测试了它。我首先下载了一个commit:然后做了一些修改。之后gitadd、commit、push都可以正常提交:新建一个分支也可以正常提交。唯一的缺点是不能切换到历史提交和历史分支。在某些场景下还是蛮有用的:当需要切换到历史分支时,也可以计算需要多少次commit,然后指定深度,这样也可以提高速度。你有没有想过,这项工作的原理是什么?git原理git通过一些对象存储信息:glob对象存储文件内容,tree对象存储文件路径,commit对象存储提交信息。关联的树将提交作为条目。所有关联的树和blob都是此提交的内容。Commit是相互关联的,head、branch、tag等都是指向具体commit的指针。可以在.git/refs下看到。这样在commit的基础上实现了branch、tag等概念。Git通过这三个对象来实现版本管理和分支切换的功能。所有对象都可以在.git/objects下看到。这就是git的工作原理。主要了解blob、tree、commit这三个对象,以及head、tag、branch、remote等refs。能够下载单个commit的原理我们知道git以某个commit作为入口关联所有对象,所以如果我们不需要历史,自然可以只下载一个commit。这样,还是基于那个commit创建了一个新的commit,并且关联了一个新的blob、tree等。但是,历史提交、树和blob无法切换回来,因为它们尚未下载,相应的标签、分支和其他指针也无法切换。这就是我们如何下载单个提交,并且仍然能够创建新的分支、提交等。历史提交越多,下载速度越快。而且,下载的项目以后仍然可以开发,可以创建新的commit、branches、tags,但是不能切换到历史commit、branches、tags。我们梳理了git的原理:通过tree、blob、commit这三个对象来存储文件和commit信息,通过commit之间的关联来实现branches、tags等功能。Commit是入口点,与所有树和blob相关联。当我们下载一个commit时,我们会下载它所有关联的树、blob和一些refs(包括标签、分支等),这就是--depth的原理。我希望您可以使用此技术来提高大型项目的gitclone速度,而无需切换到历史提交和分支。
