Git 本身是为 源代码管理 设计的,它对文本文件(如代码文件)优化很好,但对于大文件(如视频、音频、模型文件、图片等)就表现不佳。频繁提交大文件会导致 Git 仓库膨胀、克隆和拉取变慢。Git LFS(Large File Storage) 就是为解决这一问题而设计的扩展。

下面给你详细讲解 Git LFS 的原理、安装、使用以及注意事项。


1. Git LFS 简介

Git LFS 的核心思想是:

  • 大文件不直接存储在 Git 仓库中
  • Git 仓库只存储 指向大文件的指针(pointer)
  • 大文件实际存储在 Git LFS 服务器上(可与 Git 服务器集成)。
  • 克隆或拉取时,可以按需下载大文件。

优势:

  • 减少 Git 仓库体积。
  • 提高克隆和拉取速度。
  • 支持常见大文件(如音视频、CAD 文件、二进制模型)。

原理示意:

Git Repo:             Git LFS storage:
--------------        -----------------
my_code.py            (n/a)
large_model.bin --->  stored in LFS server
pointer file in Git   contains SHA256 hash and metadata

Git 仓库中只存储一个小的指针文件,真正的内容在 LFS 服务器。


2. 安装 Git LFS

2.1 macOS

brew install git-lfs

2.2 Windows

通过官网安装器:https://git-lfs.github.com

2.3 Linux

Debian/Ubuntu:

sudo apt-get install git-lfs

CentOS/RHEL:

sudo yum install git-lfs

2.4 初始化 Git LFS

安装后,第一次使用需要初始化:

git lfs install


3. 追踪大文件

Git LFS 使用 git lfs track 命令来指定哪些类型的文件需要 LFS 管理。

例如:

# 追踪所有 .psd 文件
git lfs track "*.psd"

# 追踪所有 .mp4 文件
git lfs track "*.mp4"

这会在仓库根目录生成或更新 .gitattributes 文件,内容类似:

*.psd filter=lfs diff=lfs merge=lfs -text
*.mp4 filter=lfs diff=lfs merge=lfs -text

然后提交 .gitattributes 文件:

git add .gitattributes
git commit -m "Add Git LFS tracking for PSD and MP4 files"


4. 添加和提交大文件

与普通 Git 文件一样,Git LFS 文件也可以通过 git add 添加并提交:

git add large_video.mp4
git commit -m "Add large video file"
git push origin main

推送时,Git 会自动将大文件上传到 LFS 服务器,同时 Git 仓库只保留指针。


5. 克隆包含 LFS 文件的仓库

当你克隆包含 LFS 文件的仓库时:

git clone <repo-url>

然后:

git lfs pull

  • git lfs pull 会从 LFS 服务器下载大文件。
  • 部分 Git 客户端(如 GitHub Desktop)会自动拉取 LFS 文件。

如果需要自动下载:

git clone <repo-url>
git lfs install
git lfs fetch
git lfs checkout


6. 查看 Git LFS 文件信息

  • 查看被 LFS 管理的文件:
git lfs ls-files

输出示例:

f1e2d3a4b5 * large_model.bin

  • 查看大文件的详细信息:
git lfs status


7. 移除大文件或停止 LFS 管理

  • 停止追踪某类文件:
git lfs untrack "*.psd"

  • 移除 LFS 文件:
git rm --cached large_model.bin
git commit -m "Remove LFS file"


8. 注意事项

  1. 存储限制
    • Git LFS 文件存储在服务器上,很多公共平台(如 GitHub)对 LFS 文件大小和总存储有限制:
      • GitHub 默认 LFS 存储 1 GB,单文件最大 2 GB。
    • 超过限制需要购买更多存储空间。
  2. 大文件版本控制开销
    • 每次修改大文件都会上传完整版本,因此频繁修改大文件仍会占用存储。
  3. 备份和迁移
    • 克隆仓库时,需要确保 LFS 文件随 Git 仓库一同下载,否则指针文件无法解析。
  4. 配合 CI/CD
    • 在 CI/CD 流程中,需要确保安装了 Git LFS 并执行 git lfs pull,否则构建过程可能找不到大文件。

9. 总结

特性GitGit LFS
文件类型所有文件追踪大文件(配置)
文件存储仓库直接存储仓库存指针,文件存储在 LFS 服务器
仓库大小快速膨胀仓库体积小,快克隆
历史管理版本完整版本完整,但大文件存储外部
使用场景源代码、文本视频、图片、模型等大文件

总结:Git LFS 是管理大文件的最佳实践,通过存储指针而非大文件本身,解决了 Git 仓库膨胀和克隆慢的问题,非常适合机器学习模型、设计文件、音视频等大文件场景。