解决删除 GitHub 上 git 存储库中的大文件的问题

Troubleshooting getting rid of large files in a git repository on GitHub

我有一个名为 geoplot 的项目,它在 Python 中进行地理空间绘图。它的代码通过 GitHub 上的 git 分发。 You can check it out here.

作为此包开发过程的一部分,我在 geoplot 存储库中上传并存储了一个名为 data/ 的文件夹,其中包含大量各种格式的数据文件。这些数据文件用于填充免费 example gallery.

中的示例

但是,这些文件使整个存储库大小膨胀到 ~150 MiB (issue)。这显然太多了,我该摆脱它们了。

问题是我不仅需要从当前 HEAD 中删除这些文件,我还要从整个 git 历史记录中清除这些文件。我尝试使用 git rebase 的手动方法无效。然后我按照 the canonical SO question on the matter.

中的建议尝试了 BFG Repo-Cleaner 工具

BFG 让我摆脱了这些文件——它们不再存在于历史记录中的任何地方。然而,repo 的大小(如 运行 https://github.com/ResidentMario/geoplot.git 时所见)根本没有下降!

这是我尝试过的(减去打印输出):

java -jar ../bfg-1.12.15.jar --delete-folders "data" .
git reflog expire --expire=now --all && git gc --prune=now --aggressive
git push --set-upstream https://github.com/ResidentMario/geoplot.git master --force

完整的打印输出是 in an issue on GitHub

如果有的话,我做错了什么?我该如何诊断并清除这些浪费的资源 space?

我确实提到了 reflog and gc back in 2010, but also removing old objects
(注:gc should be followed by a repack

首先,通过再次克隆您的存储库来检查您是否仍然具有相同的大小。

作为 OP Aleksey Bilogur mentions :

  • 你需要确保你的标签没有引用旧数据,然后你还需要强制推送所有标签和分支(不仅仅是master

    git push --tags origin --force
    
  • 必须从存储库历史记录中删除生成的数据。

这听起来像是一个可以在没有外部工具的情况下通过利用 filter-branch 来解决的问题。

如果您想删除 data 目录的所有历史记录,您可以 运行 从您的存储库的根目录中执行以下操作。

git filter-branch --index-filter 'git rm --cached --ignore-unmatch -r path/to/data' HEAD

这将更改当前 HEAD 指针的祖先中的每个提交。然后,您必须将所有其他分支和标签更新为这些新创建的提交,以从您的存储库中完全删除包袱。