从 git 历史记录中删除了目录及其文件,但 PACK 文件仍然包含文件

Mat*_*ias 6 git

我想从 git 存储库的历史记录中删除一个目录及其内容,以减小此 git 存储库的大小。(该目录包含二进制资产,例如模型和纹理,并且迄今为止对 git 存储库的大小贡献最大。)

我对上一个问题使用了以下解决方案:

git filter-branch --tree-filter 'rm -rf the_directory' --prune-empty HEAD
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
echo the_directory/ >> .gitignore
git add .gitignore
git commit -m 'Removing the_directory from git history'
git gc
git push origin master --force
Run Code Online (Sandbox Code Playgroud)

这似乎有效,因为我在 Github 上的提交历史记录中再也找不到对该目录及其内容的任何引用。(我有超过 1500 次提交,目录总是在那里,但不再存在。我什至找不到我明确删除目录的提交(从存储库但不是从历史记录中)。)

不幸的是,根据 Github,存储库的大小没有改变。我仍然有一个PACK450MB的文件(而实际存储库现在低于 14MB)。

我使用以下git命令来查找最大的文件:

git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -g | tail -5
git rev-list --objects --all | grep the_id
Run Code Online (Sandbox Code Playgroud)

结论 最大的文件仍然位于我想删除的目录中?

我尝试了各种方法:

但PACK文件几乎保持不变或变得更大(~500MB)。

我怎样才能减少PACK文件的大小,从而减少我的 git 存储库,更具体地说,从PACK文件中删除包含在目录中的文件及其内容?

Von*_*onC 2

您可以尝试BFG Repo-Cleaner及其--delete-folders选项:(
在裸克隆的存储库上执行此操作,复制您的存储库以进行测试)

bfg --delete-folders the_directory --delete-files the_directory  --no-blob-protection my-repo.git
git reflog expire --expire=now --all && git gc --prune=now --aggressive
Run Code Online (Sandbox Code Playgroud)

默认情况下,这将更新您的提交以及所有分支和标签。