2

我有一个(开始时)大小为 5.6G 的存储库:

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

但是,这个 repo 包含许多不再需要在 repo 中的大型二进制文件。最初它们位于目录结构中的不同位置,但都命名为“tc.dat”。作为“清理”步骤,我创建了一个cruft目录,并将git mv它们全部放入这个杂乱无章的目录中,将它们的名称更改为tc.dat1,tc.dat2等。

然后我有5个这样的文件,tc.dat1通过tc.dat5

然后我按照这个问题,并filter-branch与清理步骤一起使用以删除目录中这些文件的所有实例cruftcruft但是,这仍然在 repo 中留下了原始文件名(在移入之前)。然后,我重复了将它们从所有提交中的原始位置删除的步骤,并再次执行了清理步骤:

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

毕竟,如果我做一个

git log --all -- tc*.dat

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

我错过了什么?

4

1 回答 1

3

好的,我缺少一些东西。

按照Git pull 错误的提示:无法创建临时 sha1 文件名,我尝试了一些命令并做了:

$ git-prune
$ git-prune-packed
$ du -h -d 0
5.2G

大约下降了 0.4G,这大约是我想要删除的文件的大小。在阅读其他一些问题和手册页时,我还注意到我对git-reflogandgit-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)。

于 2012-08-17T18:49:34.430 回答