Git永久删除文件不会导致较小的回购?

时间:2012-08-17 16:40:18

标签: git git-filter-branch

我有一个回购(开始时)是5.6G大小:

aparkin@mymachine ~/repo (master)
$ du -d 0 -h
5.6G    .

但是,这个repo包含了许多不再需要在repo中的大型二进制文件。最初它们位于目录结构的不同位置,但都名为“tc.dat”。作为“清理”步骤,我创建了一个cruft目录,并将git mv所有目录创建到此cruft目录中,将其名称更改为tc.dat1tc.dat2等。< / p>

然后我有5个这样的文件,tc.dat1tc.dat5

然后我跟着this question,并使用filter-branch和清理步骤删除cruft目录中这些文件的所有实例。但是,这仍然会在repo中保留原始文件名(在移入cruft之前)。然后我重复了在所有提交中从原始位置删除它们的步骤,并再次执行清理步骤:

rm -rf .git/refs/original/ && git reflog expire --all &&  git gc --aggressive --prune 

毕竟,如果我做了

git log --all -- tc*.dat

我在历史记录中看不到任何匹配项,向我表明它们已完全删除。但是,当我再次执行du时,回购仍然是5.6G大小。鉴于这些文件大约包含0.5GB,我希望看到这个数字下降。

我错过了什么?

1 个答案:

答案 0 :(得分:3)

好的,我遗失了一些东西。

按照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-refloggit-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)。