一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Linux如何配置Git LFS大文件存储 Git处理大型二进制文件详解

时间:2026-06-06 08:03:52 编辑:袖梨 来源:一聚教程网

必须先安装git-lfs再运行git lfs install,因Git本身不含LFS功能,Linux默认不预装;直接执行git lfs track会报command not found;安装后git lfs install配置全局filter和钩子,而git lfs track须在git add前执行以确保大文件被LFS接管。

Linux上必须先装git-lfs再运行git lfs install

Git自带的git命令不包含LFS功能,Linux发行版默认也不预装git-lfs。直接运行git lfs track会报错command not found。不同包管理器安装方式不同:

  • Ubuntu/Debian:sudo apt-get install git-lfs(注意:部分旧源可能只有1.0以下版本,需确认git lfs version ≥ 1.0.1)
  • CentOS/RHEL:sudo yum install git-lfssudo dnf install git-lfs
  • 手动安装(推荐用于新版):从GitHub Releases下载最新git-lfs-linux-amd64-v*.tar.gz,解压后执行./install.sh,它会自动把二进制放到/usr/local/bin并运行git lfs install --skip-repo

git lfs install本质是往~/.gitconfig写入filter.lfs配置,并在~/.git/hooks放钩子脚本。它只影响当前用户全局Git环境,不操作任何仓库目录。

git lfs track必须在git add前执行,否则大文件已进对象库

常见错误是先git add assets/model.onnx,再git lfs track "*.onnx"——此时文件早已被Git压缩存进.git/objects,LFS无法接管。正确顺序是:

  • 确保目标文件未被git add过(可用git status确认)
  • 运行git lfs track "*.onnx",它会在项目根目录生成或修改.gitattributes,内容类似*.onnx filter=lfs diff=lfs merge=lfs -text
  • git add .gitattributes(必须提交该文件,否则协作成员无法生效)
  • git add assets/model.onnx(这时LFS钩子才会拦截,上传真实文件到LFS服务器,本地只留指针)

注意:git lfs track "data/**/*.bin"这种递归写法依赖Git ≥ 2.22;老版本只能用git lfs track "*.bin"或逐个目录git lfs track "data/a.bin" "data/b.bin"

克隆含LFS仓库时,git clone默认只拉指针,git lfs pull才下真文件

很多人克隆后发现.psd文件只有1KB,打开是ASCII文本(指针内容),这就是LFS的正常行为。原因在于Git默认启用smudge过滤器,但网络失败或配置异常会导致跳过下载。

  • 安全克隆方式(推荐):GIT_LFS_SKIP_SMUDGE=1 git clone <url>,避免首次克隆因网络卡住
  • 进目录后手动拉取:git lfs pull(拉取所有LFS文件)或git lfs pull --include="*.onnx"(按需拉取)
  • 验证是否成功:git lfs ls-files列出被跟踪文件,ls -lh assets/model.onnx确认大小是否为真实体积

如果git lfs pullbatch request: Unauthorized,说明远程LFS端点未认证——检查git remote get-url origin是否为HTTPS地址(SSH协议需额外配置LFS端点URL)。

已有仓库含大文件?用git lfs migrate重写历史要谨慎

项目已提交过100MB.zip且有多个历史版本,不能靠git rm --cached简单清理——旧提交里仍存完整对象。必须用迁移工具:

  • 先备份:git branch backup-before-lfs-migrate
  • 运行:git lfs migrate import --include="*.zip,*.psd" --everything
  • 强制推送:git push --force --all && git push --force --tags

这个操作会重写所有匹配文件的提交历史,所有协作者必须重新git clone,旧克隆仓库执行git pull会失败。另外,git lfs migrate不清理本地.git/objects中残留的原始大文件对象,需后续运行git reflog expire --expire=now --all && git gc --prune=now释放空间。

热门栏目