git中的垃圾收集提交

git中的垃圾收集提交,git,Git,我有一些由git子树创建的提交,我想进行垃圾收集(更多的是为了了解可以收集什么和为什么) 我已经检查了这些提交是否未通过以下方式引用: # 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) > gi

我有一些由
git子树创建的提交,我想进行垃圾收集(更多的是为了了解可以收集什么和为什么)

我已经检查了这些提交是否未通过以下方式引用:

# 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)
#在任何reflog中
>git reflog--全部--无abbrev提交| grep
(无输出)
#在任何分支中,本地或远程
>git分支--包含
(无输出)
>git分支-r——包含
(无输出)
#任何标签
>git标记--包含
(无输出)
#在当前索引中
>git版本列表标题| grep
(无输出)
#在来自筛选器分支的引用中
>ls.git/参考文献/原件/
(文件夹不存在)
这些地方列出了可能包含引用的列表

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

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

提交(或一般的对象)在解包成松散对象并保持这种方式至少2周后才会被实际删除。您可以使用git gc--prune=now
跳过2周的延迟

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


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

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

rm -rf .git/refs/original/*
git reflog expire --all --expire-unreachable=0
git repack -A -d
git prune

尝试此操作后,提交仍然未被收集。@LopSae:您是否尝试运行
git fsck--unreable
以确保您的提交确实无法访问?只是尝试了一下,它没有显示出来,这意味着可以从某处访问,但我找不到从何处。@LopSae:您可以尝试
git descripe--all--contains
哈哈,是的,我做了,我在回复中替换了“hash”,只是为了不把评论弄得乱七八糟。很好,缺少的是重新打包。即使是无法访问的对象,如果与可访问对象打包,也不会被处理。因此,
repack
将它们分开,然后
git prune
git gc
将正确地处理它们。即使使用
git prune
,我的存储库仍然有松散的对象。如果您遇到这种情况,
git gc
doc表明它非常努力地确保安全,并保留任何可能的引用。请确保清理/refs、/logs、FETCH_HEAD和在.git文件夹中可能找到的其他缓存。然后重新运行
git-gc--prune=now
就可以了。