Git LFS:在 git 中处理大文件的更好方法

在本模块中,我们将讨论如何使用 git LFS 有效地处理大型和二进制文件。 Git LFS 是大多数 git 用户通常不知道的必备功能之一。 在本教程中,我们将学习如何有效地使用 Git LFS 以及在何处使用它。

Git 存储命令

git 的问题

在我们转向更新的技术之前,重要的是我们承认并分析当前技术存在的问题。 Git 是一个很棒的工具,但我们必须承认它并不完美(没有软件是完美的)。 Git 在处理大文件和二进制文件时面临以下问题:

  • 较大的文件将自动导致较慢的提取和拉取。
  • 二进制文件中的任何更新都会在 git 中注册为完整的文件更改。 Git 会将整个二进制文件存储在 git 历史记录中,而不仅仅是存储更改。 这些二进制文件的频繁更新会使存储库的大小以一种不必要的方式增长。 更大的存储库意味着更慢的获取和拉取。

这些问题看起来很明显,并且还没有完美的解决方案来处理它们。 有一些解决方法和技巧可用于解决此类问题。

对您来说有一些好消息,因为您不需要手动执行这些操作。 Git LFS 是 git 的一个开源扩展,它采用了一些变通方法来使您在处理大文件时的 git 体验更加流畅。 但它究竟是如何做到的呢?

Git LFS 如何工作?

Git LFS 使用延迟拉取来下载文件及其不同版本。 这意味着默认情况下不会下载这些文件及其历史记录。 仅当您检出包含 LFS 文件的提交时才会下载相关版本。 这种方法节省了大量空间和拉取时间。 我们不会深入了解 git-lfs 工作原理的复杂细节。 如果您想进一步了解它,可以参考 Atlassian 的这篇博客。

在 Ubuntu 上安装 git-lfs

对于 Debian 和基于 Arch 的系统,可以从官方存储库下载 git-lfs 程序。

# For Debian-based system sudo apt install git-lfs  # For Arch-based system sudo pacman -S git-lfs 

对于其他 Linux 发行版,我们可以使用 git-lfs 命令下载

curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash  sudo apt-get install git-lfs 

要激活 git LFS 使用命令

# Activate git LFS git lfs install 

你已经准备好开始使用 git LFS。

如何使用 git lfs?

Git LFS 在幕后工作。 在大多数情况下,您不会直接与 git LFS 交互。 例如,push、pull checkout 命令仍然使用 git 处理。 尽管 git-lfs 会在后台按需下载这些 LFS 文件,但您实际上并不需要担心它是否正常工作。

可能您唯一需要担心的是哪些文件应该被视为 LFS。

如果要将文件添加到 git 并将其标记为 LFS 对象,则需要使用 track 命令。 track 命令告诉 git-lfs 哪些文件将被视为 LFS 对象。 要将新文件标记为 LFS 对象,请使用以下命令:

# Mark a particular file as an LFS object git lfs track "<filename.extension>" 

如果您想将特定类型的文件作为 LFS 对象进行跟踪,我们可以使用通配符来实现。 以下是将当前文件夹中的所有 mp4 文件标记为 LFS 的示例:

# Mark all mp4 files in the folder as LFS objects git lfs track "*.mp4" 

类似于 git 在 .gitignore 中存储要忽略的文件的方式,git-lfs 在名为 .gitattribute 的文件中列出要跟踪的文件的名称。 这个 .gitattribute 为存储库设置 LFS 对象。 共享 .gitattributes 将确保所有使用相同代码的开发人员都可以重用跟踪列表。

上面的方法只对之前没有被git跟踪过的文件起作用。 如果您已经有一个包含 git 跟踪的大型文件系统的存储库,则需要将文件从 git 跟踪迁移到 git-lfs 跟踪。

使用此方法将重置当前分支的历史记录,以便对这些文件使用 git-lfs。 如果要重置所有分支,可以使用 –everything 标志,但绝对不建议这样做。

# Migrate the files to be tracked under git-lfs git lfs migrate import --include="<files to be tracked>" 

git migrate 重写了很多 git 历史,你可能想在实际迁移之前看看 migrate 命令的效果。 可以通过用 info 替换 import 来完成。

# A dry run showing the effects of migrate git lfs migrate info --include="<files to be tracked>" 

闭幕致辞

在我们结束本文之前,这里有一些看似微不足道但在您使用 Git LFS 时实际上很重要的事情:

  • LFS 文件存储在 git LFS 缓存中。 默认情况下不会清除这些。 要阻止存储库在某个时间点后占用大量空间,您需要使用以下命令手动清理缓存 git lfs prune.
  • 确保在存储库上工作的所有开发人员都在他们的系统上安装了 git LFS。 这非常重要,否则 git history 可能与不同的遥控器不匹配,并会导致看起来很奇怪的错误。
  • Git migrate 会重写存储库的历史记录,请确保在使用之前完全了解其后果。

参考

  • Git LFS 迁移文档
  • Git LFS 安装维基
  • Atlassian 的博客