部分克隆实现Git大文件仓库的优雅管理

      最后更新:2020-03-17 12:57:08 手机定位技术交流文章

      谈到代码版本管理,Git现在是首屈一指的。由于领导者Linus 15年来的开拓性工作,代码农业的世界从此发生了变化。Git对任何东西都有好处,但对大的二进制文件就不好了。对于一个有很多大型二进制文件的项目,比如视频游戏仓库,仓库的管理和处理是非常头疼的。由于Git的底层设计逻辑,每次版本更改时都会拍摄完整的文件快照。如果一个大的二进制文件(如视频)改变了很多次,那么Git仓库的大小将增加多级,当仓库被同步并且团队合作时,这将是一个噩梦,尤其是当成员最初克隆时。

      ,当然,Git开源社区一直在试图解决这个问题,例如,一个解决方案(不是根本的)Git LFS

      还有一种更优雅的方法,使用部分克隆

      来部分克隆Git的一个新函数,该函数用于替换Git LFS,并通过控制Git下载(或跳过)一些Git仓库对象(快照)来从根本上管理大型文件一些克隆的昆虫已经在以前的文章中介绍过了。在本文中,我们将深入介绍一些Git克隆。

      部分克隆的开发吸引了业界的关注和参与,包括GIT领导者GITHub和GitLab,以及it巨头微软和谷歌。12.4版的GitLab测试版支持

      部分克隆可以大大加快获取和克隆的速度。由于减少了Git对象的下载,可以节省网络传输和本地用户的磁盘空间。

      和部分克隆伴随着一种选择性下载方法,即稀疏检出,它适用于具有大量文件和版本的仓库

      199 Git大文档仓库的开发历史可追溯到2010 Git-附件Git-附件由Haskell脚本编写,它允许将Git数据库映射到文件,并帮助用户管理Git仓库中的文件。在git-annex的设计中,大型文件独立于git仓库保存,只有文件名、文件元数据和其他信息保存在git仓库中,以实现大型文件的跟踪。

      git-media

      git-media是用Ruby语言开发的,这与git-annex在本地存储大型文件(媒体)并定期同步它们的方法不同。一个存储大文件的中央服务器通过git媒体同步命令

      gitlfs

      2 015用于同步,Git社区发布了自己的解决方案gitlfs(大文件存储),类似于Git媒体在

      Git LFS方案中,由音乐、图片、视频等指定的大文件可以存储在Git仓库之外,并且在Git仓库中使用元数据文件来替换(.gitattributes)通过将大型文件存储在Git仓库之外,Git仓库本身的大小可以减小,克隆Git仓库的速度可以加快,并且Git不会因为仓库中充满了大型文件而失去性能。

      Git LFS目前由主流Git服务提供商支持,GitHub和GitLab都提供内置支持。

      ,但这些解决方案是问题的临时解决方案,它们将大型文件放在Git仓库之外,而不是基本解决方案。在该方案中,大型文件管理需要单独维护,这使得同步和下载管理更加复杂,并且存储在git仓库中的额外元属性文件也会干扰Git仓库管理。

      对于这些问题,部分克隆可以避免维护两种存储和元属性文件的管理问题,从而从根本上优雅地解决大文件的问题。

      部分克隆简介我们以gitlab gitlab-com/www-git lab-com为例介绍git lab git lab-com。这个项目是gitlab在线文档仓库,其中包含许多图像和3.5G文件。使用部分克隆(-filter = blob: none)进行部分克隆可以加快至少50%的速度,并减少70%的下载数据

      对于更多的仓库,如具有详细纹理和模型的视频游戏仓库,一些克隆的性能提升将更加明显。与传统的git克隆相比,

      部分克隆提供了一个过滤器规范,用于控制下载Git对象时排除的内容例如,在本例中,我们希望排除大型二进制文件我们用不结账来比较显示效果。

      ,我们通过-no-check out选项使Git不检出默认分支。通常,签出不需要从服务器获取任何数据,因为所有对象都是在克隆时本地下载的。当上面使用部分克隆时,Git需要在后续的签出操作中获取所有本地不存在的对象,因为它被故意设置为不下载所有内容。

      当我们继续签出其他分支或提交时,我们需要下载更多不存在的快照对象。

      Git可以记住克隆仓库时提供的过滤器规范,以便获得更新并排除大型文件。只有当需要这些文件时,才会下载相应的快照对象

      git config more . origin . promistor

      # true

      git config more . origin . partialclonefile

      # blob:no e

      在提交更改时只需要提交二进制文件作为其文件。不需要安装或配置额外的工具,也不需要区分大文件和小文件。一些

      克隆深入探讨了

      可用性

      Git LFS的一个缺点是它需要安装其他工具。一些克隆不需要任何其他工具。只需更新git版本,并学习git现有命令的一些新选项例如,git克隆的过滤器选项您需要自己确定过滤器的最佳斑点大小或其他过滤器的参数。

      网络和存储

      如果使用过LFS的学生可能知道大文件的存储和传输方法不同于传统的Git对象,它们都是额外的存储由于考虑到存储容量大,最终的存储介质不同于普通文件(固态硬盘),所以下载速度应该较慢。但是,部分存储完全存储在Git对象中,可以充分享受Git快速存储的优势。以Gitlab的部分存储为例,他们可以支持多区域服务器,并且可以根据自己的位置选择离自己更近的区域服务,从而实现更好的下载性能。

      性能优化

      当使用过滤器规范来排除从Git服务器下载某些对象时,Git会检查每个对象,并排除任何与过滤器规范匹配的对象在Git的最新版本2.25中,没有针对性能进行优化的过滤性能优势并不明显。然而,Git开源社区也在促进这部分优化。杰夫·金为部分克隆斑点大小过滤提交了一个性能改进补丁,它可以极大地提高性能,预计将在Git 2.26中发布服务器端的GitLab预计将于4月22日在12.10版本中推出。

      对过滤器:稀疏过滤器的优化基于文件路径的稀疏过滤器更复杂。因为包含文件内容的Blob不包含文件路径信息,所以存储库的目录结构存储在树对象中

      文件锁定和工具集成

      管理大仓库,还有一个问题需要考虑的是客户端用户文件锁定和工具集成与纯文本源代码不同,通常不可能解决二进制文件不同版本之间的冲突。为了防止二进制文件编辑中的冲突,通常使用独占文件锁定,这意味着文件一次只能由一个人编辑,而不考虑分支。如果无法解决冲突,允许在不同分支上并行创建文件的多个版本将会报告错误。Git服务器端已经有了基本的文件锁定支持,但它只对纯文本有用,只适用于默认分支,不能与任何本地工具集成。

      本地工具集成对于二进制文件工作流非常重要,需要自动将文件锁传播到本地开发环境,并且需要允许设计人员不在命令行上使用Git将文件锁快速传播到本地开发环境也很重要,因为这样可以防止工作在发生之前被浪费掉。

      结论

      大文件对于许多项目来说是必需的虽然部分克隆仍然是一个实验功能,但它基于git的基本解决方案,具有天然的优势。开源社区也在不断优化和完善这个功能。一个成熟、高性能的Git大型文件优雅管理解决方案有望很快问世。

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/1636.html

          热门文章

          文章分类