提问者:小点点

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


我想从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

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

不幸的是,存储库的大小没有根据Github改变。我仍然有一个450MB的PACK文件(而实际存储库现在低于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

结论最大的文件仍然位于我要摆脱的目录中?

我尝试了各种方法:

  • 删除git
  • 创建的大. pack文件
  • Git减少回购大小
  • 减少git存储库大小
  • 如何从git存储库中删除未使用的对象?

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

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


共1个答案

匿名用户

您可以尝试BFG Repo-Cleaner及其--delete-folders选项:
(在裸克隆的repo、用于测试的repo副本上执行此操作)

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

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