前言
最近我加入了一家游戏公司,参与游戏项目的开发。做过游戏项目的大概都知道,游戏项目中最常见的就是大量的数据和算法配置文件。在我的项目中,有一个仓库专门用来存放游戏的配置文件,方便我们快速查询和管理这些配置。当策划人员更新配置文件时,我们会使用脚本将新的配置同步到项目中的配置文件夹,并提交到 Git 仓库。
但是,由于有些配置文件非常大,甚至达到几十或上百兆,每次使用 Git 提交或拉取这些文件时,我们的操作就变得异常缓慢,甚至会导致卡顿,有些配置文件过大也会导致推送失败。
因此,我们需要使用 Git LFS(Large File Storage)来管理这些大文件,以解决这些性能问题。
Git LFS
Git LFS(Large File Storage)是 Git 的一个扩展,主要用于高效管理大文件。它将大文件存储在外部服务器中,Git 仓库只保存文件的指针,从而减小仓库体积并提高操作性能。
在我们项目中使用 Git LFS 后,Git LFS 会将大文件上传到 LFS 服务器,而只上传指针文件到 Git 仓库。这使得推送速度更快,尤其是当提交的内容主要是大文件时,减少了不必要的 Git 操作。
在 拉取 操作时,Git 只会下载指针文件,而不会下载大文件的完整内容。Git LFS 会根据需要按需下载大文件。相比于传统 Git 仓库,拉取速度显著提高,特别是在只需要更新部分文件时,不必每次都拉取整个大文件。
总的来说,使用 Git LFS 后,提交、推送和拉取大文件的效率大幅提升,Git 仓库变得更加轻量,操作更加流畅。
安装 Git LFS
1. macOS
在 macOS 上,我们可以使用 Homebrew 来安装 Git LFS:
-
安装 Homebrew(如果还没有安装 Homebrew): 打开终端并运行以下命令:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" -
通过 Homebrew 安装 Git LFS: 在终端中运行:
brew install git-lfs
2. Windows
在 Windows 上,我们可以通过安装程序来安装 Git LFS:
-
访问 Git LFS 的官方网站下载 Windows 安装程序:Git LFS 官方下载。
-
下载并运行安装程序,按照提示完成安装。
-
安装完成后,打开 Git Bash 或者命令行工具,执行以下命令初始化 Git LFS:
git lfs install
3. Linux
在 Linux 上,我们可以使用包管理器来安装 Git LFS。以下是针对常见发行版的安装步骤:
-
Ubuntu/Debian:
sudo apt-get install git-lfs -
CentOS/RHEL: 我们需要先添加 Git LFS 的仓库,然后再进行安装:
sudo rpm -Uvh https://packagecloud.io/github/git-lfs/packages/el/7/git-lfs-2.13.3-1.el7.x86_64.rpm/download.rpm sudo yum install git-lfs -
Fedora:
sudo dnf install git-lfs
4. 验证安装
安装完成后,我们可以通过以下命令验证 Git LFS 是否安装成功:
git lfs --version
如果安装成功,终端会显示 Git LFS 的版本号。
初始化 Git LFS
初始化 Git LFS 是启用其功能的关键步骤。执行初始化命令后,Git LFS 会配置 Git 环境,安装必要的钩子,并确保 Git 在后续的操作(如提交、推送和拉取)中正确处理大文件。初始化过程还会将 Git LFS 所需的配置信息添加到项目的 .git 目录中,确保 Git 与 LFS 服务器之间的通信顺畅。
在安装 Git LFS 后,我们可以在任意位置执行以下命令进行初始化:
git lfs install
配置 Git LFS 跟踪大文件
在安装并初始化 Git LFS 后,我们接下来的步骤是配置 Git LFS 来跟踪项目中的大文件。这是通过指定需要由 LFS 管理的文件类型或文件夹来实现的。
1. 进入需要操作的大文件目录
首先,进入到我们需要配置跟踪大文件的 Git 仓库目录。例如:
cd /path/to/your/project
2. 配置 LFS 跟踪大文件
接下来,我们需要使用 git lfs track 命令来指定哪些文件类型或文件夹将由 Git LFS 管理。例如,如果我们想要 Git LFS 跟踪所有的 .png 文件和一个名为 configs/ 的文件夹中的所有文件,可以使用以下命令:
git lfs track "*.png"
git lfs track "configs/*"
这两条命令的含义如下:
git lfs track "*.png":跟踪所有.png格式的文件。git lfs track "configs/*":跟踪configs/文件夹中的所有文件。
3. .gitattributes 文件的创建
执行 git lfs track 命令后,Git 会自动在仓库中创建或更新一个名为 .gitattributes 的文件。该文件会记我们指定的 LFS 跟踪规则。例如,执行以上命令后,.gitattributes 文件中可能会包含以下内容:
*.png filter=lfs diff=lfs merge=lfs -text
configs/* filter=lfs diff=lfs merge=lfs -text
4. 提交 .gitattributes 文件
如果这是我们第一次使用 Git LFS 配置跟踪规则,Git 会自动创建 .gitattributes 文件,并记录跟踪的文件类型。在这种情况下,记得将 .gitattributes 文件添加并提交到 Git 仓库,以便其他协作者也能共享这些配置。
执行以下命令来将 .gitattributes 文件添加到 Git 版本控制中:
git add .gitattributes
git commit -m "Configure Git LFS to track large files"
git push
5. 验证 LFS 配置
为了验证是否正确配置了 Git LFS 跟踪文件,可以运行以下命令,查看当前 LFS 跟踪的文件:
git lfs ls-files
该命令将列出所有已由 Git LFS 跟踪的文件。
取消 LFS 跟踪文件
如果我们决定不再使用 Git LFS 跟踪某些文件,可以按照以下步骤取消 LFS 跟踪:
1. 移除文件的 LFS 跟踪
使用 git lfs untrack 命令来取消对某些文件类型或文件夹的跟踪。例如,如果我们之前跟踪了所有 .png 文件,并且想要取消该跟踪,可以执行以下命令:
git lfs untrack "*.png"
这个命令会从 .gitattributes 文件中移除 .png 文件的跟踪配置。
2. 删除 .gitattributes 中的配置
取消跟踪后,.gitattributes 文件中将移除对应的规则。但我们仍然需要将这个更新提交到 Git 仓库。执行以下命令:
git add .gitattributes
git commit -m "Remove .png files from Git LFS tracking"
git push
3. 移除已提交的 LFS 文件(可选)
如果我们已经将 LFS 文件提交到仓库,并且想要从仓库中彻底移除这些 LFS 文件,可以使用 git lfs migrate 命令来将它们从 Git 仓库中迁移回普通 Git 对象。例如,移除所有 .png 文件的 LFS 管理,可以运行:
git lfs migrate export --include="*.png"
这将会将 .png 文件从 LFS 中迁移回普通的 Git 文件,并从 Git 历史中移除相关的 LFS 对象。
关闭 Git LFS
如果我们决定完全停止使用 Git LFS,并希望彻底移除 Git LFS 的配置,可以按照以下步骤关闭 Git LFS:
1. 取消所有 LFS 跟踪
首先,取消所有文件的 LFS 跟踪。例如:
git lfs untrack "*"
这个命令会将 .gitattributes 文件中的所有 LFS 跟踪规则删除。
2. 从仓库中移除 LFS 配置文件
执行以下命令以从 Git 配置中移除 LFS 配置和钩子:
git lfs uninstall
这将会:
- 删除 Git 仓库中的 LFS 配置。
- 移除
.git/hooks目录下的 Git LFS 钩子。 - 从全局 Git 配置中删除 LFS 配置项。
3. 移除已上传的 LFS 对象(可选)
如果我们决定删除所有 LFS 存储的文件,可以使用以下命令来清理 LFS 存储:
git lfs prune
这个命令会删除本地 LFS 缓存中的未使用的文件,释放存储空间。
4. 提交并推送更新
在完成上述操作后,不要忘记将 .gitattributes 文件和其他变更提交到 Git 仓库:
git add .gitattributes
git commit -m "Remove Git LFS tracking"
git push
Git LFS 的优缺点
Git LFS(Large File Storage)提供了一种更高效的方式来处理大文件,在 Git 仓库中使用它有很多优势,但也存在一些限制。
优点
-
提升 Git 性能
- 减少仓库大小:Git LFS 只在仓库中保存大文件的指针,而不是文件的完整内容,这极大地减少了 Git 仓库的体积。对于包含大量大文件的项目,使用 Git LFS 后,Git 操作(如克隆、拉取、推送等)会变得更快。
- 提高操作效率:Git LFS 按需下载大文件,避免了不必要的大文件传输,从而提升了拉取、切换分支等操作的效率。
-
简化大文件管理
- 自动化文件追踪:Git LFS 会自动管理大文件,无需手动执行复杂的文件管理或清理工作。只需指定文件类型,Git LFS 就会自动将大文件托管在外部存储,并确保文件在 Git 操作中按需获取。
- 与 Git 无缝集成:Git LFS 是 Git 的扩展,和 Git 原生的版本控制操作兼容,使用起来非常直观。提交和推送大文件就像普通文件一样简单。
-
支持大规模团队协作
- 团队共享大文件:Git LFS 使得团队成员在多个工作站之间共享大文件变得更加容易。大文件存储在外部 LFS 存储服务器上,所有协作者都可以按需下载,而不会拖慢仓库操作。
- 支持多种 Git 平台:Git LFS 在 GitHub、GitLab 等常见的 Git 托管平台上得到广泛支持,便于跨平台协作。
-
支持多种类型的文件
- 支持多种文件格式:Git LFS 适用于各种大文件类型,尤其是二进制文件(如图片、视频、音频文件、模型文件等)。对于需要频繁修改的文件(如配置文件、数据库文件等)也特别适合。
缺点
-
额外的存储成本
- 外部存储费用:Git LFS 将大文件存储在外部服务器上,这意味着我们需要额外支付 LFS 存储和带宽的费用。GitHub、GitLab 等平台提供一定的免费存储额度,但超出部分需要额外购买存储和数据传输额度。
- 成本管理:对于大型项目,尤其是包含大量大文件的项目,存储成本可能会迅速增加。对于自托管的 Git LFS 服务,硬件和维护成本也是一个考虑因素。
-
依赖外部存储
- 需要外部存储服务:Git LFS 将大文件托管在外部存储服务器上,如果外部服务出现故障或不可用,可能会影响文件的访问。虽然 Git LFS 支持自托管,但配置和维护自定义 LFS 存储环境需要额外的技术投入。
- 可能会遇到存储限制:如果仓库使用了 Git LFS,但未正确配置存储或没有足够的存储空间,可能会影响文件的访问速度或导致无法访问某些文件。
-
初次配置较为复杂
- 需要额外配置:尽管 Git LFS 与 Git 本身集成,但仍然需要额外的配置来指定需要跟踪的大文件。这可能对新手用户或没有使用过 Git LFS 的团队造成一定的学习成本。
.gitattributes文件管理:Git LFS 使用.gitattributes文件来配置跟踪规则,在团队协作时,需要确保所有成员都更新并提交该文件。处理不当时可能导致配置冲突或文件无法正确跟踪。
-
可能会影响 Git 的历史操作
- 大文件无法完全回溯:Git LFS 依赖外部存储,因此 Git 历史中的某些大文件内容可能会被存储在外部 LFS 存储中。如果我们需要查看某个历史版本的大文件,可能需要访问 LFS 存储服务器,这可能会带来额外的操作延迟。
- 历史迁移复杂:对于已经加入 Git 仓库的大文件,迁移到 LFS 可能涉及到复杂的历史清理和迁移操作(例如,使用
git lfs migrate)。一旦决定使用 Git LFS 后,迁移过程需要小心处理,否则可能会影响仓库历史的一致性。
总结
Git LFS(Large File Storage)是一个强大的工具,用于处理 Git 仓库中大文件的管理,特别是对于包含大量二进制文件、大型媒体资源或者配置文件的项目。通过 Git LFS,我们能够将大文件存储在外部服务器中,显著减小 Git 仓库的体积,提高操作效率,避免 Git 操作(如提交、拉取、切换分支等)因大文件而变得缓慢或卡顿。
使用 Git LFS 后,我们可以:
- 提升性能,通过只存储大文件的指针而非完整文件,避免了 Git 仓库的膨胀。
- 简化大文件的管理,自动跟踪指定的文件类型或文件夹,确保文件处理高效且便捷。
- 支持团队协作,使得团队成员可以共享和按需下载大文件,避免了重复的文件传输。
总之,Git LFS 为管理大文件提供了一个有效的解决方案,尤其适用于游戏开发、图形设计、视频制作等需要处理大量大文件的场景。如果我们正在面对 Git 仓库因大文件而变得缓慢的问题,Git LFS 无疑是一个非常友好的工具。