大仓库推到GitHub大踩坑-Git LFS从安装到使用
前言
众所周知,GitHub会在单文件>100MB时直接拒绝,总体几个GB的pack也经常触发5xx/断开,博主今天就遇到了:
Enumerating objects: 6335, done. Counting objects: 100% (6335/6335), done.
Delta compression using up to 12 threads Compressing objects: 100% (6315/6315), done.
error: RPC failed;
HTTP 500 curl 22
The requested URL returned error: 500
send-pack: unexpected disconnect while reading sideband packet
Writing objects: 100% (6335/6335), 4.36 GiB | 4.00 MiB/s, done.
Total 6335 (delta 102), reused 1 (delta 0), pack-reused 0 fatal: the remote end hung up unexpectedly
Everything up-to-date
虽然显示远端remote end hung up了,但真正的原因还是体积过大。那么此时就需要用到Git LFS (Large File Storage) 。怎么用呢?本文将一文讲清,因为博主是踩坑体质,踩了所有坑^^。
(1)错误出现后,先确认远端有没有收到
git remote show origin
git fetch origin
git log --oneline origin/main -1
如果看不到本地最新的提交,或出现类似于以下的fatal,则说明远端是空仓库/还没首推成功,就继续按下面的步骤清理。
git remote show origin #输入
* remote origin
Fetch URL: https://github.com/xxx/xxx.git
Push URL: https://github.com/xxx/xxx.git
HEAD branch: (unknown) #主要是这行,没有能在远端创建分支git log --oneline origin/main -1
fatal: ambiguous argument 'origin/main':
(2)确认本地分支名
git rev-parse --abbrev-ref HEAD
# 如果不是 main,则:
git branch -M main
(3)安装并启用Git LFS
安装方式 1:用 conda(推荐,集群用户最干净)
在当前的 conda 环境里执行:
conda install -c conda-forge git-lfs
安装完执行一次(仅一次即可)
git lfs install
如果没有报错,会看到提示:
Git LFS initialized.
安装方式 2:系统级安装(如果有 sudo 或集群支持)
sudo apt-get update sudo apt-get install git-lfs git lfs install
安装方式3:手动安装
因为博主在学校的GPU上运行提交,因此集群上没安装git-lfs也没有sudo权限。因此,博主选择手动安装。
Git-LFS安装链接:https://github.com/git-lfs/git-lfs.git
git fls linux amd64的最新版本3.7.1:Release v3.7.1 · git-lfs/git-lfs(点这个链接)

如图,下载Linux AMD64版本,得到git-lfs-linux-amd64-v3.7.1.tar.gz,把压缩包传送到环境中home的目录并通过以下命令解压,进入解压后的目录
tar -xzf git-lfs-linux-amd64-v3.7.1.tar.gz
cd git-lfs-3.7.1
由于3.7.1版本的lfs的二进制包中的install.sh又改版问题,不再接受路径参数,默认会尝试写入/usr/local/bin,所以我们要手动复制可执行文件到用户目录:
# 1️⃣ 创建用户级 bin 目录
mkdir -p /home/zhao0546/.local/bin# 2️⃣ 手动复制可执行文件
cp git-lfs /home/zhao0546/.local/bin/# 3️⃣ 加入 PATH(临时生效)
export PATH=/home/zhao0546/.local/bin:$PATH# 4️⃣ 验证是否成功
git lfs version# 如果输出git-lfs/3.7.1 (Github; linux amd64; go1.x)
说明安装成功
你也可以通过以下操作使其永久生效(目前是临时的)
在~/.bashrc文件中加入
export PATH=/home/zhao0546/.local/bin:$PATH
然后执行:
source ~/.bashrc
接下来就可以使用Git LFS啦!
(4)如何使用Git LFS
① 进入你的项目目录,执行
# 初始化git(如果之前已经init过则跳过)
git init# 初始化git lfs(同样只需要一次)
git lfs install
② 告诉lfs要追踪哪些文件类型,然后把.gitattributes加入版本控制。
#我列出了常用的文件类型,可以直接复制
git lfs track "*.p*" "*.pth" "*.pt" "*.bin" "*.ckpt" "*.onnx" "*.tar" "*.tar.gz" "*.zip" "*.7z" "*.tgz" \
"*.h5" "*.pkl" "*.npy" "*.npz" "*.pb" "*.dat" "*.weights" "*.model" "*.tflite" \
"*.mp4" "*.mov" "*.avi" "*.mkv" "*.jpg" "*.jpeg" "*.png" "*.bmp" "*.gif" \
"*.csv" "*.tsv" "*.jsonl" "*.pickle" "*.db" "*.sqlite" "*.wav" "*.mp3" "*.flac"#加入.gitattributes进版本控制
git add .gitattributes
git commit -m "Track all large files with Git LFS"
③ 把历史中已有的大文件迁移到LFS
在这一步,会问你:

如果你在前一步还没有commit -m,或输入git status后出现了很多红色文件名(未暂存修改),那就需要再次执行以下上一步的:
git add .
git commit -m "save current changes before LFS migrate"
确认没有红色文件名后再进行迁移步骤:
git lfs migrate import --include="*.pth,*.pt,*.bin,*.ckpt,*.onnx,*.tar,*.tar.gz,*.zip,*.7z,*.tgz,*.h5,*.pkl,*.npy,*.npz,*.pb,*.dat,*.weights,*.model,*.tflite,*.mp4,*.mov,*.avi,*.mkv,*.jpg,*.jpeg,*.png,*.bmp,*.gif,*.csv,*.tsv,*.jsonl,*.pickle,*.db,*.sqlite,*.wav,*.mp3,*.flac"
④ 创建远端仓库并强制推送
注意,这里只能用--force, Git Hub 会先上传代码,再上传 LFS 对象。第一次上传 4-5 GB 可能需要几十分钟,但之后增量 push 都很快。
git remote add origin https://github.com/Ziyan0605/multi-target.git
git branch -M main
git push -u origin main --force
至此,你的仓库就已经成功地推到GitHub上了!
(5)后续push时只需要普通命令
以后修改代码或者模型的时候,只需:
git add .
git commit -m "update project"
git push
Git会自动识别哪些是LFS,哪些是普通文件。
