Skip to content
01.版本控制»01.Git»07.Git工具»LV230-git大文件.md

LV230-git大文件

一、大文件

参考:关于 GitHub 上的大文件 - GitHub Docs - GitHub 文档

1. 关于 GitHub 的大小限制

GitHub 试图为所有 Git 存储库提供充足的存储空间,尽管对文件和存储库大小存在硬性限制。为了确保我们用户的性能和可靠性,我们积极监控整体存储库健康的信号。存储库健康是各种相互作用因素的函数,包括大小、提交频率、内容和结构。

2. 文件大小限制

GitHub 限制了存储库中允许的文件大小。如果我们尝试添加或更新大于 50 MiB 的文件,Git 会发出警告。但是更改仍会成功推送到我们的存储库。

【注意】

如果我们通过浏览器将文件添加到存储库,则文件大小不能超过 25 MiB。有关更多信息,可以参考“将文件添加到存储库”。

GitHub 会阻止大于 100 MiB 的文件。要跟踪超出此限制的文件,必须使用 Git 大型文件存储 (Git LFS)。有关更多信息,可以参考“关于 Git 大型文件存储”。

如果需要在存储库中分发大型文件,则可以在 GitHub.com 上创建发布版,而不是跟踪文件。有关更多信息,可以参考“分发大型二进制文件”。

Git 并非旨在处理大型 SQL 文件。要与其他开发人员共享大型数据库,GitHub 建议我们使用文件共享服务。

二、关于 Git 大文件存储

1. 怎么存储大文件?

Git LFS 通过在仓库中存储文件的引用来处理大文件,而不是存储文件本身。为了解决 Git 架构的限制,Git LFS 创建了一个指针文件,该文件充当实际文件(存储在其他位置)的引用。GitHub 在您的仓库中管理此指针文件。当您克隆仓库时,GitHub 会使用指针文件作为映射,为我们找到大文件。

1.1 Github的存储计划

根据我们的 GitHub 计划,Git LFS 适用不同的最大大小限制。

产品最大文件大小
GitHub 免费版2 GB
GitHub Pro2 GB
GitHub Team4 GB
GitHub Enterprise Cloud5 GB

如果超出每个文件的 5 GB 限制,Git LFS 会拒绝该文件并显示错误消息。

我们也可以将 Git LFS 与 GitHub Desktop 一起使用。有关在 GitHub Desktop 中克隆 Git LFS 仓库的更多信息,可以参阅“从 GitHub 克隆仓库到 GitHub Desktop”。

我们可以选择是否将 Git LFS 对象包含在 GitHub 为我们的仓库创建的 源代码存档(如 ZIP 文件和 tarball)中。有关更多信息,可以参阅“管理仓库存档中的 Git LFS 对象”。

1.2 存储配额

如果在未购买数据包的情况下使用了超过 1 GiB 的存储空间,我们仍然可以克隆包含大型资源的存储库,但只能检索指针文件,并且无法将新文件推回。有关指针文件的更多信息,请参阅“关于 Git 大型文件存储”。

1.3 带宽配额

如果在未购买数据包的情况下每月使用超过 1 GiB 的带宽,则我们的帐户上的 Git LFS 支持将在下个月之前被禁用。

2. 指针文件格式

Git LFS 的指针文件如下所示

text
version https://git-lfs.github.com/spec/v1
oid sha256:4cac19622fc3ada9c0fdeadb33f88f367b541f38b89102a3f1261ac81fd5bcb5
size 84977953

它跟踪您正在使用的 Git LFS 的 version(版本),后跟文件的唯一标识符(oid)。它还存储最终文件的大小(size)。

【注意】

  • Git LFS 不能与 GitHub Pages 站点一起使用。
  • Git LFS 不能与模板仓库一起使用。

3. Gitee 大文件存储

Git LFS 操作指南 | Gitee 帮助中心

Gitee 一样是通过 Git LFS 来处理大文件,但是,它目前 LFS 功能 只对付费企业开放,详细配额如下:

免费版标准版高级版尊享版私有化部署版
0 GB1 GB1 GB1 GB不限

所以使用 gitee 的免费版本其实是不支持 Git LFS 的。

三、Git LFS 简介

Git 作为世界上最优秀的分布式版本控制工具,也是优秀的文件管理工具,它赋予了项目成员对项目进行远程协同开发能力,因此受到越来越多的行业从业人员的喜爱。很多优秀的项目管理平台,比如国内的 Gitee,国外的 Github,也都是以 Git 为核心操作。但是有些用户,尤其是游戏行业以及媒体行业人员可能会遇到一个问题,那就是随着提交的文件越来越多,项目越来越大,Git 的响应速度越来越慢,更烦人的是,在提交到远程仓库的最后一刻,系统可能会提示用户此次提交被拒绝,原因是提交的文件太大,触发平台额度限制 (无论是哪个平台),相信很多人在这一刻是崩溃的。

1. Git LFS

Git LFS(Git Large File Storage),即 Git 大文件存储技术。官网在这里:Git Large File Storage

在 Git 仓库中,对于非文本文件,如各种多媒体文件,软件制品文件,二进制文件等等,这些文件往往体积比较大,使用 Git 直接管理会导致仓库的体积迅速膨胀,进而导致 Git 的许多操作变慢,同时也影响仓库上传到远程端。

Git LFS 相当于 Git 的一种插件式增强工具,简单讲,它是在 Git 仓库使用这些文件的 指针代替 实际文件,而把实际文件存储在远程端 LFS 服务器,同时在本地仓库中实时追踪这些文件的变动

输入图片说明

2. 基本原理

Git 是 分布式 版本控制系统,这意味着在克隆过程中会将仓库的整个历史记录传输到客户端。对于包涵大文件(尤其是经常被修改的大文件)的项目,初始克隆需要大量时间,因为客户端会下载每个文件的每个版本。

Git LFS(Large File Storage)是由 Atlassian, GitHub 以及其他开源贡献者开发的 Git 扩展,它通过延迟地(lazily)下载大文件的相关版本来减少大文件在仓库中的影响,具体来说,大文件是在 checkout 的过程中下载的,而不是 clone 或 fetch 过程中下载的(这意味着我们在后台定时 fetch 远端仓库内容到本地时,并不会下载大文件内容,而是在我们 checkout 到工作区的时候才会真正去下载大文件的内容)。

Git LFS 通过将仓库中的大文件替换为微小的指针(pointer)文件来做到这一点。在正常使用期间,我们将永远不会看到这些指针文件,因为它们是由 Git LFS 自动处理的。

  • git add

当添加(执行 git add 命令)一个文件到我们的仓库时,Git LFS 用一个指针替换其内容,并将文件内容存储在本地 Git LFS 缓存中(本地 Git LFS 缓存位于仓库的.git/lfs/objects 目录中)。

img
  • git push

推送新的提交到服务器时,新推送的提交引用的所有 Git LFS 文件都会从本地 Git LFS 缓存传输到绑定到 Git 仓库的远程 Git LFS 存储(即 LFS 文件内容会直接从本地 Git LFS 缓存传输到远程 Git LFS 存储服务器)。

img
  • git checkout

checkout 一个包含 Git LFS 指针的提交时,指针文件将替换为本地 Git LFS 缓存中的文件,或者从远端 Git LFS 存储区下载。

img

Git LFS 是无缝的:在我们的工作副本中,我们只会看到实际的文件内容。这意味着我们不需要更改现有的 Git 工作流程就可以使用 Git LFS。只需按常规进行 git checkout、编辑文件、git add 和 git commit。git clone 和 git pull 将明显更快,因为我们只下载实际检出的提交所引用的大文件版本,而不是曾经存在过的文件的每一个版本。

3. 安装 Git LFS

可以直接参考:git-lfs/git-lfs: Git extension for versioning large files,这里 windows 还有 linux 等系统都有。

3.1 Linux

git-lfs/INSTALLING.md at main · git-lfs/git-lfs

3.2 Windows

官方仓库中是这么说的:Git LFS is included in the distribution of Git for Windows. Alternatively, you can install a recent version of Git LFS from the Chocolatey package manager.

翻译一下就是:Git LFS 包含在 Windows 版 Git 的发行版中。此外,你也可以从 Chocolatey 包管理器安装最新版本的 Git LFS。所以其实我们 windows 下的 git 是自带 lfs 工具的。

参考资料:

Git LFS 操作指南 | Gitee 帮助中心

详解 Git 大文件存储(Git LFS) - 苍青浪 - 博客园

莫道桑榆晚 为霞尚满天.