git lfs会减少推送到Github的文件的大小吗?

时间:2019-09-13 10:50:29

标签: git git-lfs

Github不允许推送大于100 MB的文件。使用git lfs,可以将大文件推送到Github。 我只是对过程的想法感到好奇:在我看来,git lfs只是一个附加的开关,它可以将大文件(仅通过https:/)推送到Github。但是我无法成像,仅此而已?

altlassian状态下的重复数

  

Git LFS(大文件存储)是由以下人员开发的Git扩展   Atlassian,GitHub和其他一些开源贡献者认为   通过下载减少存储库中大文件的影响   他们的相关版本懒惰。具体来说,大文件是   在结帐过程中而不是在克隆过程中下载或   正在获取。 Git LFS通过替换您的大型文件来实现此目的   具有微小指针文件的存储库。在正常使用期间,您永远不会   看到这些指针文件,因为它们是由Git LFS自动处理的。


一些细节:我有一个小项目,因为有一个大文件,所以我无法将其推送到github。然后,我可以按以下步骤进行迁移和推送:

git lfs migrate import --everything --include="*.pdf"
git reflog expire --expire-unreachable=now --all
git gc --prune=now
git push origin master
git lfs checkout (? If you have local files with 1 kB only? Happend some days later...)

一切都被推送到Github-甚至是大文件。因此,如果使用git lfs(可以快速安装且易于使用)允许,Github为什么拒绝大文件?

1 个答案:

答案 0 :(得分:2)

问题不是大文件本身,而是Git存储它们的方式。 Git使用解密和压缩功能通过网络存储文件并发送文件。 Deltification通过引用另一个文件并仅存储差异来存储数据较少的文件。

当服务器端重新打包存储的数据时,Git还将通过运行git fsck来验证数据是否完好无损。这意味着必须至少部分地对每个文件进行解压缩,删除和处理。对于大文件,这将导致使用大量CPU和内存,从而影响服务器上存储的其他存储库。文件也可能会被重新删除,这意味着该文件和其他文件必须完全读取到内存中,而与其他文件进行比较需要付出一定的代价,然后对其进行重写和重新压缩。另一种选择是简单地存储这些文件而不进行评估,仅压缩它们,但这会导致磁盘使用失控,尤其是对于压缩效果不佳的文件。

在客户端,用户必须在克隆上下载整个存储库。这会导致使用大量带宽来克隆通常无法压缩的大文件,这意味着用户必须将所有这些内容本地存储,即使他们只对少数修订版感兴趣。

Git LFS通过使用单独的基于HTTP的协议并允许将对象上载到不属于主Git存储库的单独位置,从而消除了Git存储库中的所有存储。这意味着可以避免Git施加的压缩和删除费用,并且用户只能下载其当前结帐所需的文件。这意味着服务器负载和带宽都大大降低了,客户端存储需求也大大降低了。