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

Does git lfs reduce the size of files pushed to Github?

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

altlassian 中的记载

Git LFS (Large File Storage) is a Git extension developed by Atlassian, GitHub, and a few other open source contributors, that reduces the impact of large files in your repository by downloading the relevant versions of them lazily. Specifically, large files are downloaded during the checkout process rather than during cloning or fetching. Git LFS does this by replacing large files in your repository with tiny pointer files. During normal usage, you'll never see these pointer files as they are handled automatically by 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 - 甚至是大文件。因此,为什么 Github 拒绝大文件,如果允许使用 git lfs(可以快速安装并轻松运行)?

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

服务器端重新打包存储数据时,Git也会通过运行git fsck验证数据是否完好。这意味着每个文件都必须至少部分地解压缩、去deltified和处理到内存中。对于大文件,这会导致使用大量 CPU 和内存,从而影响存储在服务器上的其他存储库。文件也可能被重新删除,这意味着该文件和其他文件必须完全读入内存,以某种成本与其他文件进行比较,然后重写和重新压缩。另一种方法是简单地存储这些文件,而不进行删除,只压缩它们,但这会导致磁盘使用失控,尤其是对于压缩效果不佳的文件。

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

Git LFS 通过使用单独的基于 HTTP 的协议并允许将对象上传到不属于主 Git 存储库。这意味着可以避免 Git 因压缩和去化而产生的成本,并且用户可以只下载他们当前结帐所需的文件。这意味着服务器负载和带宽都大大减少,客户端存储需求也是如此。