Skip to content

git-lfs 简单使用

  • Git LFS(Git Large File Storage,大文件存储)是 Github 开发的一个 Git 的扩展,用于实现 Git 对大文件的支持。
  • Git LFS 处理大文件的方式是存储对仓库中文件的引用,而不实际文件本身。
  • 为满足 Git 的架构要求,Git LFS 创建了“指针文件”,充当对实际文件(存储在其他位置)的引用。
  • GitHub 在仓库中管理此指针文件。克隆仓库时,GitHub 使用指针文件作为映射来查找大文件。

Git Large File Storage

  • 不同于 git 每次保存 diff,对于 git 来说,如果是模型或者一些设计大文件,改变一点,对于仓库来说会增加很大的体积,不一会就能几个 G。
  • Git LFS 可以把音乐、图片、视频等指定的任意大文件资源存储在 Git 仓库之外,减小 Git 仓库本身的体积,使克隆 Git 仓库的速度加快,也使得 Git 不会因为仓库中充满大文件而损失性能。

注意

  • 官网:Git Large File Storage(git-lfs.com)
  • 安装 Git LFS 需要 Git 的版本不低于 1.8.5。
  • 安装 Git LFS 之后,需要在本地仓库中运行 git lfs install 命令,以启用 Git LFS。

关于存档中的 Git LFS 对象

  • GitHub 以 ZIP 文件和 tarball 的形式创建存储库的源代码存档。用户可以在仓库的主页上下载这些存档或者将其作为发行版资产。
  • 默认情况下,Git LFS 对象不会包含在这些存档中,只有这些对象的指针文件包含在其中。
  • 为了提高仓库存档的可用性,可以选择包含 Git LFS 对象。若要包含在内,则必须由已提交到存储库的 .gitattributes 文件中的跟踪规则覆盖 Git LFS 对象。

指针文件格式

Git LFS 的指针文件看起来像:

text
version https://git-lfs.github.com/spec/v1
oid sha256:4cac19622fc3ada9c0fdeadb33f88f367b541f38b89102a3f1261ac81fd5bcb5
size 84977953

它会跟踪所用 Git LFS 的 version,后接文件的唯一标识符 (oid)。它还会存储最终文件的 size

Github 远程仓库启用 Git LFS

Github 仓库 Settings 选项卡 -> Archives 菜单 -> 勾选 Include Git LFS objects in archives (在存档中包含 Git LFS 对象)

安装 Git LFS

Windows

powershell
> scoop install git-lfs
> git lfs install

Linux 系统

git-lfs/INSTALLING.md at main · git-lfs/git-lfs

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

# RHEL
$ curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.rpm.sh | sudo bash
$ sudo yum install git-lfs
$ git lfs install

使用

没有特别说明的情况下,Git LFS 不会处理大文件问题,使用 git lfs track 命令进行大文件追踪。

追踪文件

追踪单个文件

  • 例如追踪一个名为 test.png 的文件,使用 git lfs track "test.png" 命令。

  • .gitattributes 文件已创建,并包含以下信息:

    bash
    test.jpg filter=lfs diff=lfs merge=lfs -text
  • 从现在开始,LFS 将处理此文件。现在,我们可以按照以前的方式将其添加到存储库中。注意,对其他任何更改.gitattributes 也必须提交到存储库

    bash
    $ git add .gitattributes
    $ git add design-resources/design.psd
    $ git commit -m "Add design file"

强烈建议将本地 .gitattributes 文件提交到存储库中

  • 如果依赖与 Git LFS 关联的全局 .gitattributes 文件,可能会导致在参与其他 Git 项目时发生冲突。
  • 在存储库中包含 .gitattributes 文件允许创建分支或新克隆的人员更轻松地使用 Git LFS 进行协作。
  • 在存储库中包含 .gitattributes 文件允许将 Git LFS 对象选择性地包含在 ZIP 文件和 tarball 存档中。

追踪同一后缀的所有文件

  • 如果要追踪所有后缀为 png 的文件,使用 git lfs track "*.png" 命令。
  • 运行此命令后,不但会追踪已存在的所有后缀为 png 的文件,也包括以后创建的 png 文件。

查看正在跟踪的所有模式的列表

bash
$ git lfs track

查看正在跟踪的文件列表

bash
$ git lfs ls-files

提交大文件

  • 将文件添加到与关联的扩展名相匹配的仓库,提交代码时需要将 .gitattributes 文件也提交到仓库

    bash
    git add file.psd
    git add .gitattributes
  • 提交完成后,执行git lfs ls-files命令可以查看 LFS 跟踪的文件列表。

    bash
    54dc742407 * file.psd
  • 将代码推送到远程仓库后,LFS 跟踪的文件会以“Git LFS”的形式显示:

    bash
    $ git commit -m "add file.psd"
    $ git push origin main
    Git LFS: (1 of 1 files) 81.04 MB / 81.04 MB
    ......

克隆包含 Git LFS 文件的远程仓库

  • 使用 git clone 命令

    bash
    $ git clone git@github.com:ryanjiena/git-lfs-demo.git
  • 本地已经存在需要拉取

    bash
    git lfs fetch origin main
  • 使用 git lfs clone 命令

    bash
    $ git lfs clone git@github.com:ryanjiena/git-lfs-demo.git

了解更多 Git LFS 的使用,可执行git lfs help命令查看帮助。

将原有仓库转换为 Git LFS 仓库

如需将原有仓库的文件以 LFS 方式存储,查看参考教程

取消跟踪并从 LFS 删除文件

  • 从 LFS 取消跟踪特定类型的所有文件,并将其从缓存中删除:

    shell
    $ git lfs untrack "file.psd"
    $ git rm --cached "file.psd"
  • file.psd 重新添加到常规 git 跟踪中并提交:

    shell
    $ git add "file.psd"
    $ git commit -m "restore "file.psd" to git from lfs"
bash
$ git lfs uninstall
Hooks for this repository have been removed.
Global Git LFS configuration has been removed.