Git 永久删除文件不会导致较小的存储库?

标签 git git-filter-branch

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

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

但是,此存储库包含许多不再需要位于存储库中的大型二进制文件。最初它们位于目录结构中的不同位置,但都命名为“tc.dat”。作为“清理”步骤,我创建了一个 cruft 目录,并将所有内容 git mv 放入这个 cruft 目录中,将它们的名称更改为 tc.dat1tc.dat2

然后我有 5 个这样的文件,tc.dat1tc.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-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)。

关于Git 永久删除文件不会导致较小的存储库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12009770/

相关文章:

git - 从 Git 历史记录中删除敏感文件及其提交

git - 借助 Mercurial 书签再现 git 分支模型

git - 为什么用现在时来描述 git 提交被认为是好的做法?

git - flutter 安装期间的libusbmuxd版本错误

c# - GIT 智能 HTTP 协议(protocol)的服务端和客户端有哪些细节区别

git - 如何从包含子模块的 git 存储库中 rebase git submodule 保留对子模块提交的引用?

git - 从 git 历史记录中删除未使用的 Assets

Git:恢复到以前的提交状态

git - 将许多子目录分离到一个新的、独立的 Git 存储库中

git 有效替换邮箱地址