Git 尝试推送不再位于 repo 或缓存中的超大文件

Posted

技术标签:

【中文标题】Git 尝试推送不再位于 repo 或缓存中的超大文件【英文标题】:Git tries to push oversized files that are no longer in repo nor in cache 【发布时间】:2021-10-25 23:18:55 【问题描述】:

总结:我做了一个包含超大文件的 git 提交,在尝试推送时,得到了可怕的“大文件”错误。我对 repo 进行了重组,使其拥有一个不再包含任何大文件的新***目录,但在尝试推送时仍然出现“大文件”错误。我尝试了各种常见的解决方案(如下),但 git 一直在尝试推送新*** repo 之外的文件。

我所做的详细信息:

    我手动将 .git 和 .gitignore 文件删除到我想要的新目录中,如 here 所述。

    我确认通过git rev-parse --show-toplevel成功识别新的根目录。

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

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

    我通过git reset HEAD~重置,然后再次尝试推送,但我得到了和上面一样的错误。

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

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

任何帮助将不胜感激。

【问题讨论】:

git push 命令推送 commits。每个提交都有每个文件的完整快照。这不是缓存:这是 Git 工作的基本方式。如果某个提交有一个大文件,它就会永远拥有那个文件,因为没有任何提交可以改变。如果你不喜欢那个提交,你可以停止使用它——以及它的所有后代——并避免git push-ing 那个提交(请注意,尝试推送它的一个后代将采取 that也提交,这就是为什么你必须抛弃所有后代)。 有一些专门用于重写存储库以丢弃大文件的工具:BFG 和新奇的git filter-repo 都支持这一点。 Filter-repo 是现在已弃用、难以使用的filter-branch 的替代品,但 filter-repo 实际上并未包含在 Git 发行版中:您必须获取并安装它。 (与 BFG 相同。) 【参考方案1】:

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

较新的选项现在是 third-party tool git filter-repo(带有 installation process,并使用 Python)

为了不必列出每个大文件,您可以确定要删除任何文件的大小:

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

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

【讨论】:

以上是关于Git 尝试推送不再位于 repo 或缓存中的超大文件的主要内容,如果未能解决你的问题,请参考以下文章

Git没有编辑远程存储库的访问权限

Git 分支提示位于其远程对应项的后面,并且正在防止“推送”

GIT Repo 错误:无法推送到远程存储库

使用Git bash安装YoastSEO.js github repo

在 circleci 中缓存 npm 依赖项

Gitlab在推送git用户时提示输入密码