如何检查 Git 仓库是否使用 LFS

GitGitBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习如何判断一个 Git 仓库是否正在使用 Git 大文件存储(Git Large File Storage,LFS)。我们将从检查 .gitattributes 文件开始,探索使用 LFS 的关键指标,该文件对于配置 LFS 跟踪至关重要。

然后,你将使用 git lfs env 命令来验证仓库内的 LFS 环境和设置。最后,我们将使用由 LFS 跟踪的文件进行测试,以确认 LFS 正在按预期主动管理大文件。这种实践方法将为你提供在 Git 项目中识别和理解 LFS 集成的实用技能。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("Git")) -.-> git/SetupandConfigGroup(["Setup and Config"]) git(("Git")) -.-> git/BasicOperationsGroup(["Basic Operations"]) git/SetupandConfigGroup -.-> git/config("Set Configurations") git/SetupandConfigGroup -.-> git/git("Show Version") git/BasicOperationsGroup -.-> git/add("Stage Files") git/BasicOperationsGroup -.-> git/status("Check Status") git/BasicOperationsGroup -.-> git/commit("Create Commit") subgraph Lab Skills git/config -.-> lab-560102{{"如何检查 Git 仓库是否使用 LFS"}} git/git -.-> lab-560102{{"如何检查 Git 仓库是否使用 LFS"}} git/add -.-> lab-560102{{"如何检查 Git 仓库是否使用 LFS"}} git/status -.-> lab-560102{{"如何检查 Git 仓库是否使用 LFS"}} git/commit -.-> lab-560102{{"如何检查 Git 仓库是否使用 LFS"}} end

检查 .gitattributes 文件

在这一步中,我们将探讨 Git LFS 如何使用一个名为 .gitattributes 的特殊文件来跟踪大文件。该文件会告知 Git 哪些文件应由 LFS 处理,而不是直接存储在 Git 仓库中。

首先,确保你位于项目目录中。打开终端并输入:

cd ~/project/my-time-machine

现在,让我们创建一个虚拟文件,稍后我们会让 Git LFS 来跟踪它。我们将其命名为 large_image.png

echo "This is a large image file placeholder." > large_image.png

此命令创建了一个名为 large_image.png 的文件,并在其中放入了一些文本。在实际场景中,这可能是一个大型二进制文件,如图像、视频或存档文件。

接下来,我们需要告诉 Git LFS 跟踪这种类型的文件。我们使用 git lfs track 命令来完成此操作。该命令还会自动在你的仓库中创建或更新 .gitattributes 文件。

git lfs track "*.png"

你应该会看到类似以下的输出:

Tracking "*.png"

此命令告诉 Git LFS 跟踪所有扩展名为 .png 的文件。它还会在 .gitattributes 文件中添加一个条目。

现在,让我们查看 .gitattributes 文件的内容,看看添加了什么。

cat .gitattributes

你应该会看到类似以下的输出:

*.png filter=lfs diff=lfs merge=lfs -text

.gitattributes 文件中的这一行是关键,它告诉 Git 对 .png 文件使用 LFS。它指定对于匹配 *.png 模式的文件,Git 应应用 lfs 过滤器进行差异比较、合并和存储。-text 部分确保 Git 不会尝试将二进制文件视为文本文件。

理解 .gitattributes 文件是有效使用 Git LFS 的关键。通过它,你可以配置哪些类型的大文件由 LFS 管理,从而使你的主 Git 仓库保持小巧和快速。

运行 git lfs env 验证 LFS

在这一步中,我们将使用 git lfs env 命令来检查 Git LFS 环境,并确认它已在我们的仓库中正确设置。此命令会提供有关 Git LFS 安装和配置的有用信息。

确保你仍处于项目目录中:

cd ~/project/my-time-machine

现在,运行 git lfs env 命令:

git lfs env

你应该会看到类似以下的输出(确切的输出可能会因 Git LFS 版本和系统配置而略有不同):

git-lfs/3.x.x (Linux; zsh)
git version 2.34.1

Endpoint=
  https://github.com/labex/my-time-machine.git/info/lfs (auth=none)
Endpoint (SSH)=
  [email protected]:labex/my-time-machine.git/info/lfs (auth=none)

LocalWorkingDir=/home/labex/project/my-time-machine
LocalGitDir=/home/labex/project/my-time-machine/.git
LocalGitStorageDir=/home/labex/project/my-time-machine/.git/lfs
LocalMediaDir=/home/labex/project/my-time-machine/.git/lfs/objects
LocalRecentObjectsDir=/home/labex/project/my-time-machine/.git/lfs/objects/sha256/recent
LocalRecentObjectsLogDir=/home/labex/project/my-time-machine/.git/lfs/objects/sha256/recent/logs
LocalTmpDir=/home/labex/project/my-time-machine/.git/lfs/tmp
LocalTriggers=

Disk space utilization:
  du -s -h .git/lfs
  4.0K    .git/lfs

Git LFS initialized.

此输出提供了大量信息,包括:

  • 正在使用的 Git LFS 版本。
  • 正在使用的 Git 版本。
  • LFS 端点(LFS 文件将从这些端点推送/拉取,不过在这个实验中我们不会使用远程仓库)。
  • Git LFS 在 .git 目录中存储其数据的本地目录。
  • LFS 对象占用的磁盘空间(目前非常小,因为我们尚未添加任何大文件)。
  • 确认此仓库中已初始化 Git LFS。

运行 git lfs env 是快速验证当前仓库中 Git LFS 是否已正确安装和配置的好方法。它能帮助你了解 LFS 存储数据的位置,并确认必要的钩子和过滤器已设置好。

使用 LFS 跟踪的文件进行测试

在这最后一步中,我们将把 LFS 跟踪的文件添加到 Git 暂存区并提交。这将展示 Git LFS 如何与普通文件区别处理该文件。

首先,确保你位于正确的目录中:

cd ~/project/my-time-machine

在前面的步骤中,我们已经创建了 large_image.png 文件,并配置了 Git LFS 来跟踪 .png 文件。现在,让我们使用 git add 将文件添加到暂存区:

git add large_image.png

此命令将文件暂存以用于下一次提交。由于 large_image.png.gitattributes 中的模式匹配,Git LFS 会拦截此操作。Git LFS 不会将整个文件内容添加到 Git 索引中,而是添加一个小的“指针”文件。

让我们检查状态以查看已暂存的文件:

git status

你应该会看到表明 large_image.png 是一个待提交的新文件的输出:

On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   .gitattributes
        new file:   large_image.png

注意,.gitattributes 也被暂存了,因为我们在第一步中对其进行了修改。

现在,让我们提交更改:

git commit -m "Add LFS tracked image placeholder"

你应该会看到类似以下的输出:

[master (root-commit) abcdefg] Add LFS tracked image placeholder
 2 files changed, X insertions(+)
 create mode 100644 .gitattributes
 create mode 100644 large_image.png

提交消息确认 .gitattributeslarge_image.png 都已提交。然而,large_image.png 的实际内容并未直接存储在 Git 提交中。相反,提交存储的是小的指针文件,而大文件内容由 Git LFS 管理。

为了查看差异,让我们使用 git show 查看 Git 中存储的文件内容。此命令显示特定提交中文件的内容。

git show HEAD:large_image.png

你应该会看到类似以下的输出:

version https://git-lfs.github.com/spec/v1
oid sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
size 31

这是指针文件的内容,而不是实际的“This is a large image file placeholder.”文本。这表明 Git 存储的是大文件的引用,而 Git LFS 管理实际的文件内容。

这就是 Git LFS 的核心概念:通过仅存储大文件的指针来保持主 Git 仓库的轻量级,而大文件内容则单独存储。

总结

在这个实验中,我们学习了如何检查一个 Git 仓库是否使用了 Git LFS。首先,我们了解了 .gitattributes 文件的作用,它对于配置 Git LFS 至关重要。我们创建了一个虚拟文件,并使用 git lfs track 命令让 Git LFS 管理具有特定扩展名的文件,观察到该命令如何自动更新 .gitattributes 文件并添加必要的配置。然后,我们查看了 .gitattributes 文件的内容,了解了 git lfs track 命令添加的条目,以及 filter=lfsdiff=lfsmerge=lfs-text 属性的含义。

我们还探索了 git lfs env 命令,将其作为验证仓库中 Git LFS 是否存在和配置情况的另一种方法。该命令提供了关于 Git LFS 环境的详细信息,包括版本、仓库设置和跟踪的文件模式,全面展示了 LFS 的设置情况。最后,我们学习了如何通过添加和提交符合配置模式的文件来测试 LFS 跟踪,确认了 Git LFS 能够正确处理大文件,而不是将其完整内容存储在主 Git 仓库中。