我有一个存储库(开始时)大小为 5.6G:
aparkin@mymachine ~/repo (master)
$ du -d 0 -h
5.6G .
但是,此存储库包含许多不再需要位于存储库中的大型二进制文件。最初它们位于目录结构中的不同位置,但都命名为“tc.dat”。作为“清理”步骤,我创建了一个 cruft
目录,并将所有内容 git mv
放入这个 cruft 目录中,将它们的名称更改为 tc.dat1
、tc.dat2
等
然后我有 5 个这样的文件,tc.dat1
到 tc.dat5
然后我关注了this question ,并使用 filter-branch
以及清理步骤来删除 cruft
目录中这些文件的所有实例。但是,这仍然在存储库中保留了原始文件名(在移动到 cruft 之前)。然后,我在所有提交中重复将它们从原始位置删除的步骤,并再次执行清理步骤:
rm -rf .git/refs/original/ && git reflog expire --all && git gc --aggressive --prune
在这一切之后,如果我做一个
git log --all -- tc*.dat
我在我的历史记录中没有看到任何匹配项,这表明它们已被完全删除。然而,当我再次执行 du
时,存储库的大小仍然是 5.6G。鉴于这些文件大约有 0.5GB,我预计这个数字会下降。
我错过了什么?
最佳答案
好吧,我遗漏了一些东西。
按照 Git pull error: unable to create temporary sha1 filename 上的提示进行操作我尝试了一些命令并执行了:
$ git-prune
$ git-prune-packed
$ du -h -d 0
5.2G
大约减少了 0.4G,这大约是我想要删除的文件的大小。我在阅读few other questions时也注意到以及 git-reflog
和 git-gc
的手册页,其中我使用了 reflog expire
和 --aggressive --prune
不正确。两者都接受有关历史记录可以追溯到多远的参数,并且在这两种情况下我都想要所有历史记录,因此需要now
参数:
$ rm -rf .git/refs/original/
$ git reflog expire --all --expire=now
$ git gc --aggressive --prune=now
$ du -h -d 0
4.5G .
比我开始时节省了相当多的钱(1.1G)。
关于Git 永久删除文件不会导致较小的存储库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12009770/