Git 尝试推送既不在回购也不在缓存中的超大文件

Git tries to push oversized files that are no longer in repo nor in cache

总结: 我做了一个包含超大文件的 git 提交,并且在尝试推送时遇到了可怕的“大文件”错误。我重组了 repo 以拥有一个不再包含任何大文件的新顶级目录,但在尝试推送时我仍然遇到“大文件”错误。我尝试了各种常见的解决方案(如下),但 git 一直在尝试推送新顶级存储库之外的文件。

我所做的详细信息:

  1. 我手动删除了 .git 和 .gitignore 文件到我想要的新目录,如 here.

    所述
  2. 通过git rev-parse --show-toplevel确认新根目录成功识别。

  3. 我再次尝试推送到远程 (git push origin main),但出现错误 File <filepath> is 102.90 MB; this exceeds GitHub's file size limit of 100.00 MB,其中 <filepath> 是旧目录中的路径,不是新的。

  4. 我试图通过 git rm -r --cached <filepath> 从缓存中删除文件(如已接受的答案 here 中所述),但是 这会产生错误 fatal: <filepath> is outside repository.

  5. 我通过git reset HEAD~重置,然后再次尝试推送,但我得到了与上述相同的错误。

  6. 我试图通过 git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch stitched.csv' HEAD 过滤分支历史记录以删除涉及大文件 (stitched.csv) 的提交,如 here 所述。然后我再次尝试推送,仍然出现同样的错误,再次参考 stitched.csv.

实际上,我有很多超大文件,所以我真的不想手动从缓存中删除每个文件。自从涉及大文件的那些以来,我做出了许多好的承诺。

如有任何帮助,我们将不胜感激。

如评论所述,您需要从 Git 历史记录中过滤并删除那些大文件。

最近的选项现在是 third-party tool git filter-repo (with its installation process,并使用 Python)

为了不必列出每个大文件,您可以确定一个大小,超过该大小您希望删除任何 个文件:

git filter-repo --strip-blobs-bigger-than 2M

将“2M”(两个Mo)替换为合适的大小:见“How to find the N largest files in a git repository?”。