【Git】利用 LFS 突破 GitHub 大文件上传限制

Git LFS

利用 Git LFS 突破 GitHub 大文件上传限制

接触此技术背景

本人一直有将笔记备份的习惯,虽然已经有云同步,但是异地存档能再加多层保险

随时间推移,笔记内容也越来越多,我的笔记快照的体积越来越大,最近一次直接超出了 Git 单次推送的最大体积限制(100MB),在查询解决方法时,发现 Git 有一种叫 LFS 的技术(Large File Storage),他能很好的解决此问题。

技术介绍

Git LFS 是 Git 的一个开源扩展,旨在解决 Git 在处理大尺寸二进制文件(如视频、数据集、压缩包)时的性能瓶颈。

因为 Git 的设计初衷是管理文本文件,它会完整记录文件的每一个版本。对于像我这样提交这么大我体积的的 ZIP 包,如果修改一次再提交,仓库体积会立刻翻倍。

底层原理

那么它的思路就是把大文件给"拆开"。

LFS 的解决方法是:当你将文件放入 LFS 管理时,Git 仓库中存储的不再是那个 180MB 的实体,而是一个几百字节的指针文件。真实的二进制数据被存储在 GitHub 的 LFS 专用服务器上。

当执行 git checkout​ 时,LFS 会根据指针里的哈希值,自动从服务器下载对应的真实文件覆盖到你的工作区。这样本地的 .git 目录(版本库历史)依然保持精简,这个设计非常巧妙。

技术实现

我的最近一次提交是错误的,虽然提交了但是 push 失败了,故必须通过重置索引并应用 LFS 规则来修复。

  1. 首先要安装 LFS 扩展

    bash 复制代码
    # 在你本地的git工作区
    git lfs install
  2. 标记你的大文件由 LFS 来管理,以我的笔记快照为例,它的文件格式就是 .ZIP,那么命令就是

    bash 复制代码
    git lfs track "*.zip"

    注意:这会生成或更新 .gitattributes 文件,必须将其一同提交

  3. 重新添加并提交

    由于你之前的 Commit 已经包含了这个超限文件,需要先撤销上一次失败的提交,重新打包提交

    bash 复制代码
    # 撤销上一次 commit,但保留文件变动
    git reset --soft HEAD~1
    
    # 重新添加属性文件和大文件
    git add .
    git commit -m "commit message"
    git push origin master

执行到这一步,就已经能正确 push 上去了

后续维护

看到这会有疑惑:那么这次能提交成功了,后续该如何维护呢?

维护 LFS 需要关注 .gitattributes 文件、本地存储占用以及云端配额三个维度

  • 追踪管理

    你需要明确告诉 Git 哪些文件属于大文件。使用命令 git lfs track "你的文件"​。 这会更新 .gitattributes​ 文件。++每次更新必须提交这个属性文件++,否则协作成员拉取代码时,Git 会将其当作普通大文件处理,再次导致推送失败

  • 监控状态

    • 使用 git lfs ls-files:查看当前索引中哪些文件正受 LFS 管理
    • 使用 git lfs status:检查当前暂存区的对象状态
  • 本地存储清理

    长期频繁更新大文件会导致本地 .git/lfs​ 目录体积激增。使用 git lfs prune 可以安全删除本地不再被当前分支引用的旧版二进制块。

  • 配额管理

    GitHub 免费账户提供 1GB 存储和 1GB 每月下行流量,这要注意它的限制,如果配额耗尽,别人拉下来的包都是指针文本,不会真正下载内容

希望对你有帮助,祝您身体健康。

相关推荐
AI成长日志2 小时前
【GitHub开源项目】Harness CI/CD平台深度解析:架构设计、核心功能与实战指南
ci/cd·开源·github
云巅的cat3 小时前
Git 使用指南
git·github
70asunflower3 小时前
GitHub 从 0 到 1 使用教程
github·从0到1
yeziyfx12 小时前
vs code 使用Git拉取/克隆(clone)仓库项目
git·vscode
最贪吃的虎20 小时前
GitHub推送又超时了?试试SSH
运维·ssh·github
smachao20 小时前
Redis Desktop Manager(Redis可视化工具)安装及使用详细教程
redis·git·bootstrap
szcsun51 天前
git的常用命令
git
jian110581 天前
android studio 解决git用户名和用户邮箱不一致的问题
git