15

我创建了一些提交git subtree,我希望收集垃圾(更多的是任何实际目的,只是为了了解可以收集什么以及为什么可以收集)。

我已经检查过这些提交没有通过以下方式引用:

# In any reflog
> git reflog --all --no-abbrev-commit | grep <hash>
(no output)

# In any branch, local or remote
> git branch --contains <hash>
(no output)
> git branch -r --contains <hash>
(no output)

# In any tag
> git tag --contains <hash>
(no output)

# In the current index
> git rev-list HEAD | grep <hash>
(no output)

# In references from filter-branch
> ls .git/refs/original/
(the folder does not exist)

这些是git gc 文档列出的可能包含参考的地方。

之后仍然存在给定的提交git gc

我错过了什么吗?或者是否有任何 git 管道命令可以检查所有这些引用?

4

2 回答 2

19

每次我想删除松散的对象时,我都会使用以下命令:

rm -rf .git/refs/original/*
git reflog expire --all --expire-unreachable=0
git repack -A -d
git prune
于 2013-02-21T05:33:01.390 回答
6

提交(或一般的对象)实际上并没有被删除,直到它们被解压缩成松散的对象并保持这种状态至少 2 周。您可以使用git gc --prune=now跳过 2 周的延迟。

通常情况下,git 会将您的对象打包到一个包文件中。这提供了比松散对象更好的压缩和效率。这通常在执行 a 时发生git gc。但是,如果一个对象未​​被引用,那么git gc会将其解包回一个松散的对象中。

一旦解包,git gc将自动修剪旧的松散未引用对象。这由--prune=<date>标志控制,默认为 2 周前,因此它会修剪任何超过 2 周的旧的未引用对象。通过指定--prune=now,您要求git gc修剪任何比现在更旧的对象,这基本上意味着修剪任何存在的未引用对象。

于 2013-02-20T23:36:06.427 回答