我想从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
结论最大的文件仍然位于我要摆脱的目录中?
我尝试了各种方法:
但是PACK
文件几乎保持不变或变得更大(~500MB)。
如何减少PACK
文件的大小,从而减少我的git存储库,更具体地说,如何从PACK
文件中删除包含在目录及其内容中的文件?
您可以尝试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
默认情况下,这将更新您的提交以及所有分支和标签。