Git LFS
我们来详细介绍一下 Git LFS(Large File Storage),这是一个用于管理 Git 仓库中大文件的扩展工具。
一、Git LFS 是什么?
Git LFS 是由 GitHub 开发的一个开源项目,它的核心目标是解决 Git 在处理大文件时遇到的性能问题。
为什么需要 Git LFS?
默认情况下,Git 会将项目中的每一个文件的每一个版本都完整地存储在仓库的历史记录中。对于源代码文件(如 .swift, .h, .m)这类小文件来说,这没有问题。但如果你的项目中包含了以下类型的大文件:
- 图片资源:尤其是高分辨率的
.png,.jpg文件。 - 设计文件:如
.psd,.sketch,.fig。 - 音频 / 视频文件:如
.mp3,.mp4。 - 二进制库文件:如
.framework,.a。 - 数据集:如
.csv,.json等大型数据文件。
随着这些大文件的修改和提交,Git 仓库的体积会迅速膨胀。这会导致:
- 克隆(Clone)和拉取(Pull)速度极慢:因为每次操作都需要下载整个仓库的完整历史,包括所有大文件的所有版本。
- 本地磁盘占用巨大。
- Git 操作(如
git status,git checkout)变慢:Git 需要处理大量的数据。
Git LFS 的工作原理:
Git LFS 并没有改变 Git 的核心工作方式,而是作为一个扩展,它的核心思想是:“跟踪指针,而非文件本身”。
- 替换文件:当你使用 Git LFS 跟踪一个大文件时,它会将这个文件从你的工作区移动到 Git LFS 的缓存目录。
- 创建指针:在原来的文件位置,Git LFS 会创建一个极小的 “指针文件”(通常只有几 KB)。这个指针文件包含了原始大文件的 SHA-256 哈希值和一些元数据。
- 提交指针:Git 会像对待普通文件一样,跟踪和提交这个指针文件到仓库中。因此,Git 仓库的体积几乎不会因为大文件而增长。
- 下载文件:当其他开发者克隆或拉取仓库时,他们首先会得到这个指针文件。然后,Git LFS 会检测到指针文件,并自动从配置好的 LFS 服务器(如 GitHub, GitLab, Bitbucket 或你自己搭建的服务器)下载对应的原始大文件,并将其放到工作区的正确位置。
二、Git LFS 的安装与配置
1. 安装 Git LFS
- macOS:使用 Homebrew
bash
brew install git-lfs - Windows / Linux:请参考 Git LFS 官方网站 的安装指南。
2. 初始化 Git LFS
在你的 Git 仓库根目录下,运行以下命令来初始化 LFS:
bash
git lfs install
这个命令只需要在每个仓库中运行一次。它会配置 Git 的钩子(hooks),让 Git LFS 能够在适当的时候自动工作。
三、Git LFS 的基本使用
Git LFS 的使用非常简单,主要围绕几个核心命令。
1. 跟踪大文件(git lfs track)
这是最核心的命令,用于告诉 Git LFS 哪些文件需要被特殊处理。
- 跟踪单个文件:
bash
git lfs track "path/to/your/large-file.psd" - 跟踪特定类型的文件(推荐):
bash
# 跟踪所有 .psd 文件 git lfs track "*.psd"# 跟踪所有在 images/ 目录下的 .png 和 .jpg 文件 git lfs track "images/*.{png,jpg}"
运行 git lfs track 后,Git LFS 会在仓库根目录下创建一个名为 .gitattributes 的文件(如果不存在的话),并将跟踪规则写入其中。
2. 查看跟踪规则(git lfs track / git lfs ls-files)
- 查看当前所有的 LFS 跟踪规则:
bash
git lfs track - 查看当前工作区中被 LFS 跟踪的文件:
bash
git lfs ls-files
3. 提交和推送(git add, git commit, git push)
一旦你用 git lfs track 跟踪了文件,后续的操作就和普通的 Git 操作完全一样了。
bash
# 添加文件(无论是新文件还是修改后的文件)
git add path/to/your/large-file.psd
git add .gitattributes # 非常重要!务必将 .gitattributes 文件也提交到仓库# 提交
git commit -m "Add a large PSD file tracked by Git LFS"# 推送
git push origin main
当你执行 git push 时,Git LFS 会自动将原始的大文件上传到 LFS 服务器,而 Git 只会推送指针文件。
4. 克隆和拉取(git clone, git pull)
对于已经使用 Git LFS 的仓库,其他开发者克隆时也需要安装并初始化 Git LFS。
bash
# 克隆仓库
git clone https://github.com/your-username/your-repo.git
cd your-repo# (首次克隆时)确保 Git LFS 已安装并初始化
git lfs install# 拉取 LFS 文件(如果克隆时没有自动下载)
git lfs pull
现代版本的 Git LFS 通常会在 git clone 时自动触发 git lfs pull,所以大部分情况下不需要手动执行。
5. 其他常用命令
- 下载特定版本的 LFS 文件:
bash
git lfs checkout <commit-hash> -- path/to/file - 查看 LFS 对象的信息:
bash
git lfs info - 迁移现有仓库中的大文件到 LFS:Git LFS 提供了
git lfs migrate命令,可以将历史提交中的大文件也迁移到 LFS 中。这是一个比较复杂的操作,建议在备份后谨慎使用,并参考官方文档。
四、在 iOS 开发中的最佳实践
-
跟踪哪些文件?
- 设计源文件:
.psd,.sketch,.ai,.fig等。 - 大型图片资源:虽然我们会压缩
Assets.xcassets中的图片,但原始的高分辨率素材如果需要纳入版本控制,应该用 LFS 跟踪。 - 第三方二进制库:如果你手动管理一些大型的
.framework或.a文件(而不是通过 CocoaPods 等包管理器),应该用 LFS 跟踪。 .dSYM文件:虽然.dSYM文件通常不上传,但如果你有特殊需求要存储,它绝对是 LFS 的候选。
- 设计源文件:
-
不要跟踪哪些文件?
- 已经压缩并放入
Assets.xcassets的图片:这些文件已经经过优化,体积相对较小,且是构建 App 的直接依赖,可以由 Git 正常跟踪。 - CocoaPods / Carthage / Swift Package Manager 管理的依赖:这些文件应该被
.gitignore忽略,因为它们可以通过包管理器重新下载。 - 构建产物:如
DerivedData目录下的所有内容,应被.gitignore忽略。
- 已经压缩并放入
-
.gitattributes文件- 务必将
git lfs track命令生成的.gitattributes文件提交到 Git 仓库。这个文件是团队协作的关键,它告诉每一个克隆仓库的人哪些文件是由 LFS 管理的。 - 你可以手动编辑
.gitattributes文件来管理复杂的跟踪规则。
- 务必将
-
团队协作
- 确保团队中的每一个成员都了解并安装了 Git LFS。可以在项目的
README.md文件中添加一个关于 Git LFS 的简短说明。
- 确保团队中的每一个成员都了解并安装了 Git LFS。可以在项目的
五、总结
Git LFS 是管理 Git 仓库中大文件的完美解决方案。对于 iOS 开发项目而言,它可以:
- 显著减小仓库体积,让克隆和拉取速度飞快。
- 保持 Git 操作的流畅性,即使项目中包含了大量设计源文件或二进制库。
- 清晰地分离代码和大文件,使仓库更 “干净”。
强烈建议在任何有大文件的 Git 项目中都采用 Git LFS,它能为你和你的团队节省大量的时间和带宽。
