0%

带有大文件的 GitHub 项目的创建与拉取——使用 Git Large File Storage (LFS)

0 前言

某天下午在远程工作站上装 ROS 把我搞烦了,抽时间写了个开源脚本工具 rostaller,完全一键安装,自动在线更新 YAML 文件,不用再去应对手动安装时必然会遇到的 rosdep init 报错和 rosdep update 报错。工具最初的版本包含一个 .tar.gz 格式的压缩文件,向 GitHub 进行推送时被拒绝:文件大小超限(100 MB)。对于该问题,可以使用 Git Large File Storage (LFS) 对要上传的大文件进行托管。

Git LFS

1 准备工作

1.1 安装 Git LFS

Windows

直接官网下载二进制文件进行安装即可。

Ubuntu

  • 安装 curl

    1
    sudo apt install curl
  • 请求并执行 Git LFS 前置脚本

    1
    curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
  • 安装 Git LFS

    1
    sudo apt install git-lfs

1.2 为当前用户配置 Git LFS

每个用户执行一次即可:

1
git lfs install

2 创建含有大文件的仓库

GitHub 端仓库的创建过程无异,不再赘述,对应的本地仓库的创建过程如下:

  • 初始化

    1
    git init
  • 配置远程仓库地址

    1
    git remote add origin git@github.com:your_username/your_repo.git
  • 告诉 Git LFS 需要追踪哪些文件。例如,追踪 .tar.gz 格式的压缩文件

    1
    git lfs track "*.tar.*"
  • 上一步骤将自动生成 .gitattributes 文件,将其添加到暂存区

    1
    git add .gitattributes
  • 向暂存区中添加剩余变更、提交、推送

    1
    2
    3
    git add --all
    git commit -m "first commit"
    git push orgin main

3 拉取含有大文件的 GitHub 仓库

直接 clone 即可。若在安装 Git LFS 前执行了 clone,则拉取下来的仓库中并不包含大文件本体,取而代之的是指向其 LFS 存储对象的文件指针,此种情况下,可通过在本地仓库中执行下述命令来 拉取文件指针所指向的完整对象:

1
git lfs pull

4 存在的问题

Git LFS 免费用户有 1 GB 的免费存储空间和每月 1 GB 的下载带宽,下载使用的总流量超限后会导致仓库无法 clone

1
2
3
4
5
6
7
8
9
10
11
12
13
Downloading rosdistro.tar.gz (105 MB)
Error downloading object: rosdistro.tar.gz (2dffd34):
Smudge error: Error downloading rosdistro.tar.gz (2dffd34dccb171115c2fcd4326735780181e0705bba57d502d3bf85538f92740):
batch response: This repository is over its data quota.
Account responsible for LFS bandwidth should purchase more data packs to restore access.

Errors logged to /home/shipeng/rostaller/.git/lfs/logs/20210706T224710.870367616.log
Use `git lfs logs last` to view the log.
error: external filter 'git-lfs filter-process' failed
fatal: rosdistro.tar.gz: smudge filter lfs failed
warning: Clone succeeded, but checkout failed.
You can inspect what was checked out with 'git status'
and retry the checkout with 'git checkout -f HEAD'

大意是,使用的 LFS 下载流量达到带宽限制,需要购买更多数据包。一般使用勉强够了。

参考

  1. Git Large File Storage
  2. Git LFS 的使用
  3. GitHub Docs - 管理仓库存档中的 Git LFS 对象
  4. GitHub Docs - 关于存储和带宽使用情况
Thank you for your donate!