GitLab发布实验性新功能Partial Clone

Git近期版本开始支持部分复制(Partial Clone)功能,而程序代码托管服务GitHub与GitLab也开始跟进,GitHub在年初时提到他们正在评估部分复制功能,成熟时会逐步发布,而GitLab现在则宣布开始提供部分复制功能实验性测试。

部分复制是Git的一项新功能,用来取代Git LFS(Large File Storage),部分复制使Git不再下载存储库中的每个文件,使其在大型存储库运行得更好。部分复制经GitLab、GitHub、微软和Google多年合作发展,在近期开花结果,现在于GitLab中开始实验性测试,管理员可以视情况激活该功能。

Git发展至今已经快15年,过去有许多项目不使用Git,因为像是电玩游戏这类具有许多大型二进制文件的项目,当Git复制存储库时,Git会下载存储库中每个文件的每个版本,在大多数的使用情况中,下载历史记​录或许是有用的功能,但大型二进制文件的复制和截取速度却非常慢。

而要在Git处理大型文件,需要额外的工具,像是2010年发布的git-annex和2015年的Git LFS,以类似的方式增加Git处理大型文件的能力,其主要中心思想是,不在Git中存储大型文件,而是存储大型文件的指标,当需要使用到大型文件时,再使用指标按需下载文件。

不过,这种方法的缺点不只是易受人为错误影响,而且指标的编码方式依带宽以及文件类型决定,并同时影响存储库的所有人,由于对带宽或是存储的假设,会随着时间改变,同时也会依位置而有所不同,但是存储库的编码策略却不够灵活到可随时改变。现在推出的部分复制功能可解决这些问题,因为传输的资料较少,加快了截取和复制的速度,也减少本机计算机的磁盘使用量,GitLab以自家gitlab-com项目举例,复制速度快50%,传输资料量减少70%。

当用户在普通的git clone指令之后加入过滤器规范,就能以该规范排除特定内容,像是使用—filter=blob:none,就可在复制时排除大型二进制文件,GitLab提到,在像是gitlab-com这类包含许多图像的项目上使用,更能体现出部分复制的优点。

GitLab的部分复制现在支持多个远程服务器,而且将会让大型文件可以存储在像是AWS S3等对象存储中,但与Git LFS不同的是,存储库或是实例管理员,可以决定对象存储的位置,以及按需求改变配置。部分复制比Git LFS使用起来更简单,因为Git LFS需要安装其他工具,而部分复制不需要,不过用户仍需要学习使用新选项和配置。

由于在最新的Git 2.25中,过滤功能并未优化,因此当使用过滤规范要从Git服务器中,截取并排除特定对象,Git需要检查存储库中的每个文件,并排除所有与过滤器规范相符的对象,不过,Git开发社群已经改进Blob大小过滤性能,预计会在Git 2.26中更新,GitLab计划会在12.10版本中跟进。

近期Git在复制相关功能的更新,除了增加部分复制功能外,也添加了稀疏签出(Sparse Checkout)功能,GitLab解释,部分复制是针对大型存储库的特定性能优化,而稀疏签出则是一个相关的优化功能,特别针对具有极大量文件和版本的存储库。