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. 注意事项
- 存储限制
- Git LFS 文件存储在服务器上,很多公共平台(如 GitHub)对 LFS 文件大小和总存储有限制:
- GitHub 默认 LFS 存储 1 GB,单文件最大 2 GB。
- 超过限制需要购买更多存储空间。
- Git LFS 文件存储在服务器上,很多公共平台(如 GitHub)对 LFS 文件大小和总存储有限制:
- 大文件版本控制开销
- 每次修改大文件都会上传完整版本,因此频繁修改大文件仍会占用存储。
- 备份和迁移
- 克隆仓库时,需要确保 LFS 文件随 Git 仓库一同下载,否则指针文件无法解析。
- 配合 CI/CD
- 在 CI/CD 流程中,需要确保安装了 Git LFS 并执行
git lfs pull
,否则构建过程可能找不到大文件。
- 在 CI/CD 流程中,需要确保安装了 Git LFS 并执行
9. 总结
特性 | Git | Git LFS |
---|---|---|
文件类型 | 所有文件 | 追踪大文件(配置) |
文件存储 | 仓库直接存储 | 仓库存指针,文件存储在 LFS 服务器 |
仓库大小 | 快速膨胀 | 仓库体积小,快克隆 |
历史管理 | 版本完整 | 版本完整,但大文件存储外部 |
使用场景 | 源代码、文本 | 视频、图片、模型等大文件 |
总结:Git LFS 是管理大文件的最佳实践,通过存储指针而非大文件本身,解决了 Git 仓库膨胀和克隆慢的问题,非常适合机器学习模型、设计文件、音视频等大文件场景。
发表回复