git gc --aggressive --prune = all不会从存储库中删除大文件

Zhu*_*Wei 13 git version-control garbage-collection

关于"如何从repo中删除意外添加的大文件"有很多SO问题,其中许多建议使用git gc命令.但是,我发现它不适合我,我不知道出了什么问题.

这是我做的:

$ git init
Initialized empty Git repository in /home/wzyboy/git/myrepo/.git/
$ echo hello >> README
$ git add README 
$ git commit -a -m 'init commit'
[master (root-commit) f21783f] init commit
 1 file changed, 1 insertion(+)
 create mode 100644 README
$ du -sh .git
152K    .git
$ cp ~/big.zip .
$ git add big.zip 
$ git commit -a -m 'adding big file'
[master 3abd0a4] adding big file
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 big.zip
$ du -sh .git
77M .git
$ git log --oneline 
3abd0a4 adding big file
f21783f init commit
$ git reset --hard f21783f
HEAD is now at f21783f init commit
$ git log --oneline 
f21783f init commit
$ git gc --aggressive --prune=all
Counting objects: 6, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), done.
Total 6 (delta 0), reused 0 (delta 0)
$ git gc --aggressive --prune=now
Counting objects: 6, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), done.
Total 6 (delta 0), reused 6 (delta 0)
$ du -sh .git
77M .git
$ git version
git version 2.2.2
Run Code Online (Sandbox Code Playgroud)

在上面的控制台输出中,我创建了一个新的git repo,添加了一个小文本文件,.git目录的大小为152K,到目前为止一直很好.然后我在repo中添加了一个大文件,目录膨胀到77M.但是,在我尝试删除大文件(git reset --hardgit rebase -i)之后,无论我如何运行git gc不同的选项,我都无法恢复大文件声明的磁盘空间.

谁能告诉我为什么git gc在我的情况下不起作用?我该怎么做才能恢复磁盘空间?是否可以使用git gc而不是git filter-branch?恢复磁盘空间?

谢谢.

Zhu*_*Wei 18

正如Andrew C所建议的那样,在git gc能够回收松散的对象之前,需要使用reflog来解除对象的取消引用.因此,通过意外添加大文件来恢复磁盘空间的正确方法是:

git reflog expire --expire=now --all
git gc --aggressive --prune=now
Run Code Online (Sandbox Code Playgroud)

这将删除所有reflog,因此请谨慎使用.

  • _“这将删除所有引用日志”_您能解释一下为什么这可能是一个问题吗? (2认同)
  • @eri0o 如果您不小心弄乱了 git 历史记录(例如删除未合并的分支),您可以使用 reflogs 来恢复。 (2认同)