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

时间:2017-10-29 21:14:59

标签: git

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

我将以下solution用于之前的question

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

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

我尝试了各种方法:

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

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

1 个答案:

答案 0 :(得分:1)

您可以尝试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

默认情况下会更新您的提交以及所有分支和标记。