github 上传大文件

使用 git-lfs 上传大于100MB文件到 github

介绍

希望将 jdk-8u202-linux-x64.tar.gz (186M) 上传到 github ,从而生成 jdk-8u202-linux-x64.tar.gz 的直链,用于构建包含 jdk 的 docker 镜像

github

参考:
https://docs.github.com/zh/repositories/working-with-files/managing-large-files/about-large-files-on-github

github 文件大小限制

  • GitHub 限制存储库中允许的文件大小。 如果尝试添加或更新大于 50 MiB 的文件,您将从 Git 收到警告。 更改仍将成功推送到仓库,但您可以考虑删除提交,以尽量减少对性能的影响。
  • 如果通过浏览器将文件添加到存储库,该文件不得大于 25 MiB
  • GitHub 阻止大小超过 100 MiB 的文件。要跟踪超出此限制的文件,必须使用 Git Large File Storage (Git LFS)
    • Git LFS 处理大文件的方式是存储对仓库中文件的引用,而不实际文件本身。 为满足 Git 的架构要求,Git LFS 创建了“指针文件”,充当对实际文件(存储在其他位置)的引用。 GitHub 在仓库中管理此指针文件。 克隆仓库时,GitHub 使用指针文件作为映射来查找大文件。–> 无法生成文件直链
    • Git LFS 的不同最大大小限制取决于 GitHub 计划,免费版文件大小上线为2
  • 如果需要在存储库中分发大文件,则可以在 GitHub.com 上创建版本,而不是跟踪文件。参阅 分发大型二进制文件
    • 如果需要在存储库内分发大型文件,可以在 GitHub.com 上创建发行版。 发行版允许您打包软件、发行说明和指向二进制文件的链接,以供其他人使用。 有关详细信息,请访问“关于发行版
    • 不限制二进制发行版文件的总大小,也不限制用于传递它们的带宽。 但每个文件必须小于 2 GiB。

所以,无法直接将体积为 186MB 的 jdk-8u202-linux-x64.tar.gz 上传到仓库,可行的方式如下

  • 使用 git lfs,问题:无法生成直链(点击链接即可下载)
  • 使用 发行版
  • 将 jdk 拆分为最大100MB的子包,上传到 github 获取直链,然后在 Dockerfile 中下载所有子包后,将子包合并为完整包
    • 拆分子包命令:tar -czf - jdk-8u202-linux-x64.tar.gz | split -b 100m -d - jdk8u202.tar.gz
    • 合并子包:cat jdk8u202.tar.gz* | tar -zxf -

git lfs 上传文件介绍

github 使用 git lfs 上传大于 100MB 文件

  1. ubuntu 安装 git lfs
    • 安装 git lfs 软件仓库: curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
    • 安装 git lfs: sudo apt-get install -y git-lfs
  2. 进入 git 项目目录: cd large_file_test
  3. 追踪待上传的大文件: git lfs track files/jdk-8u202-linux-x64.tar.gz
    • 执行 git lfs track 命令后,会生成 .gitattribute 文件,文件内记录了待上传文件的信息,将 .gitattribute 文件上传后,才可以上传大文件
  4. .gitattribute 文件上传
    • git add .gitattribute
    • git commit -m "add .gitattribute"
    • git push origin main
  5. 上传大文件
    • git add files/jdk-8u202-linux-x64.tar.gz
    • git commit -m "add jdk-8u202-linux-x64.tar.gz"
    • git push origin main

需要注意的是,通过git-lfs上传文件是有空间限制的,免费用户如果上传的文件超过了1G,账号就会被冻结,所以大家在上传前一定要检查一下自己还剩多少空间(Settings - Billing and plans - Plans and usage - Git LFS Data)。

问题

  1. batch response: Git LFS is disabled for this repository.

    如果在上传过程中出现如下报错:

    1
    2
    
    batch response: Git LFS is disabled for this repository.
    Uploading LFS objects:   0% (0/1), 0 B | 0 B/s, done
    

    就说明你的账号被冻结了,需要在GitHub后台提交解封申请。
    https://support.github.com/contact

  2. gitee 使用 git lfs上传失败

    1
    2
    3
    4
    
    $ git push origin mainwarning: Authentication error: Authentication required: LFS only supported repository in paid or trial enterprise.
    batch response: LFS only supported repository in paid or trial enterprise.      
    Uploading LFS objects:   0% (0/1), 0 B | 0 B/s, done.
    error: failed to push some refs to 'https://gitee.com/msdemt/large-files.git'
    

    解决:
    删除 .git/hooks/pre-push

    1
    
    rm .git/hooks/pre-push
    

    然后执行上传

    1
    
    git push origin main 
    

参考:
https://cloud.tencent.com/developer/article/1677003

Licensed under CC BY-NC-SA 4.0
Built with Hugo
主题 StackJimmy 设计