在 Ubuntu 18.04 上 git lfs 推送到 github 失败

时间:2021-05-29 13:02:32

标签: git github ubuntu-18.04 git-lfs

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

    var str1 = "test,Test";
    var newstr ;
    var index1 = str1.indexOf(',');
    if(str1.charAt(index1+1) == str1.charAt(index1+1).toUpperCase()) {
      var newstr = str1.substr(0, index1) + "*" + str1.substr(index1+1 , str1.length);
     
    }else {
     newstr = str1;
    }
    console.log(newstr);

然后我使用 master 重新定位我的功能分支,以将此文件放入我的功能分支。我使用 *.pt filter=lfs diff=lfs merge=lfs -text 安装了 git-lfs 然后我尝试使用

取消暂存文件
sudo apt install git-lfs 

通过运行 $ git rm --cached bigFile.pt rm 'bigFile.pt' 我得到

git status

然后我尝试添加它,提交并推送它,但由于大尺寸而再次失败并出现类似的推送失败错误消息。然后我用谷歌搜索,然后找到了这个命令(git-lfs.github.com)并在分支内的文件夹中运行它:

$ 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

然后我按照说明运行:

$git lfs install
Updated git hooks.
Git LFS initialized.

它似乎更新了 .gitattributes,它已经由 master 分支的 rebase 更新了。

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

git lfs track "*.pt"

运行 git lfs ls-files

git rm --cached bigFile.pt

那么:

$ 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 子模块添加到另一个存储库。我在这里测试和验证的想法用完了?感谢如何验证和解决此问题以便我可以推送此分支的任何帮助?

谢谢

1 个答案:

答案 0 :(得分:2)

看起来你做了一些包含大文件的提交,然后你添加了更多的提交,其中你用 LFS 间接文件替换了大文件。这意味着您需要删除具有大文件的提交

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

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

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

Git 旨在添加新提交,而不是删除旧提交。这使得很难删除任何包含大文件的提交。要自动做到这一点,需要专门的工具。幸运的是,GitHub 已经为您提供了说明和工具,可以告诉您如何执行此操作。见他们here。简短版本是使用 git lfs migrate,如果您有现代 Git-LFS。另见this other GitHub page