git lfs 在 Ubuntu 18.04 上推送到 git 集线器故障

git lfs push to github failure on Ubuntu 18.04

我有一个与远程 GitHub 存储库同步的本地 git 存储库。在功能 b运行ch 上,我需要 add/commit 一个大型二进制 .pt 文件 (236Mb),然后将其推送到 GitHub 中的远程源。最初我正常添加文件(git 添加),提交文件(git 提交)然后尝试推送(git 推送)。由于文件大小,推送到 GitHub 失败并建议使用 git-lfs。出现此错误后, 我的同事将 .gitattributes 文件推送到 GitHub 上的远程主机 b运行ch,内容如下:

*.pt filter=lfs diff=lfs merge=lfs -text

然后我将我的功能 b运行ch 重新设置为 master 以将此文件放入我的功能 b运行ch 中。我使用 sudo apt install git-lfs 安装了 git-lfs 然后我尝试使用

取消暂存文件
$ git rm --cached bigFile.pt
rm 'bigFile.pt'

通过 运行宁 git status 我得到

$ git status
On branch feature_branch
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    deleted:    bigFile.pt

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    bigFile.pt

然后我尝试添加它,提交并推送它,但由于大小过大而再次失败,并显示类似的推送失败错误消息。然后我用谷歌搜索,然后在 b运行ch:

的文件夹中找到了这个命令 (git-lfs.github.com) 和 运行
$git lfs install
Updated git hooks.
Git LFS initialized.

然后我按照说明进行操作 运行:

git lfs track "*.pt"

这似乎更新了 .git 已经通过主 b运行ch.运行ch.

的 rebase 更新的属性

然后我尝试使用以下方法取消暂存文件:

git rm --cached bigFile.pt

运行 git lfs ls-files

$ git lfs ls-files
e7e59a98b5 - bigFile.pt

然后:

$ git lfs status
On branch feature_branch

Objects to be committed:

    bigFile.pt (LFS: e7e59a9 -> File: e7e59a9)

Objects not staged for commit:

然后我添加了文件:

$ git add bigFile.pt

然后检查:

$ git lfs status
On branch feature_branch

Objects to be committed:


Objects not staged for commit:

$ git lfs ls-files
e7e59a98b5 - bigFile.pt

$ git status
On branch feature_branch
nothing to commit, working tree clean

但是最后推送失败如下?!:

$ git push --set-upstream origin feature_branch
Uploading LFS objects: 100% (1/1), 247 MB | 0 B/s, done.                                                                                                                                                    
Counting objects: 16, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (14/14), done.
Writing objects: 100% (16/16), 218.00 MiB | 1.08 MiB/s, done.
Total 16 (delta 9), reused 0 (delta 0)
remote: Resolving deltas: 100% (9/9), completed with 6 local objects.
remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.
remote: error: Trace: 259f0ded862988234bfa0bf1094ba2da8a3b59f4a9a0ea91f8c48ef330598dc4
remote: error: See http://git.io/iEPt8g for more information.
remote: error: File bigFile.pt is 235.15 MB; this exceeds GitHub's file size limit of 100.00 MB
To github.com:reporName.git
 ! [remote rejected] feature_branch -> feature_branch (pre-receive hook declined)
error: failed to push some refs to 'git@github.com:repoName.git'

顺便说一句,此存储库已作为 git 子模块添加到另一个存储库。我 运行 没有想法在这里测试和验证?任何帮助如何验证和解决这个问题,以便我可以推送这个 b运行ch 表示赞赏?

谢谢

看起来您提交了一些具有大文件的提交,然后又添加了一些提交,其中您已将大文件替换为 LFS 间接文件。这意味着您需要 删除 具有大文件的 提交

请记住,当您使用 Git-LFS 时,您正在使用 两个 外部网站来存储您的数据。首先,您将大文件发送到某个 LFS 存储站点。这些大文件(尚未)提交。然后,在将真实文件安全地存储在别处的情况下,您创建并推送仅存储从 LFS 存储站点检索大文件所需的信息的提交。因此 commits 以 Git 存储库的形式存在于某处(例如,在 GitHub 上)但在任何地方都没有任何大文件他们。相反,他们有一些小文件,上面有说明不要使用这个文件,使用你通过 LFS 大文件交换器替换器技巧获得的大文件,这里是如何获取大文件。 Git 周围的 LFS 包装器拦截了 Git 将小替换文件放入工作树的尝试,并将大文件放在那里。

(请注意,这意味着任何使用常规 Git 克隆您的存储库的人都会得到并看到这些奇怪的小间接文件。他们必须自己设置 Git-LFS 以便他们可以让相同的包装程序拦截将小文件放出以供查看或编辑的尝试。)

但是如果您以错误的顺序执行此操作,您首先提交大文件。然后你 将大文件发送到第二个站点 ,然后你 删除大文件 并放入小文件“这是获取真实文件的方法" 文件,并制作包含这些小文件的 另一个 提交。您仍然有包含大文件的提交!

Git 旨在添加新提交,而不是删除旧提交。这使得很难删除任何包含大文件的提交。要自动做到这一点,需要专门的工具。幸运的是,GitHub 已经为您提供了说明和工具,可以告诉您如何执行此操作。看到他们 here. The short version is to use git lfs migrate, if you have a modern Git-LFS. See also this other GitHub page.