解决删除 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
指针的祖先中的每个提交。然后,您必须将所有其他分支和标签更新为这些新创建的提交,以从您的存储库中完全删除包袱。
我有一个名为 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
指针的祖先中的每个提交。然后,您必须将所有其他分支和标签更新为这些新创建的提交,以从您的存储库中完全删除包袱。