【问题标题】:Garbage collect commits in git垃圾收集在 git 中的提交
【发布时间】:2013-02-06 03:59:39
【问题描述】:

我有一些由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 documentation 列出的可能包含引用的地方。

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

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

【问题讨论】:

    标签: git


    【解决方案1】:

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

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

    【讨论】:

    • 太好了,缺少的是重新包装。如果与可达对象打包在一起,即使是不可达对象也不会被释放。所以repack 将它们分开,然后git prunegit gc 将正确处理它们。
    • 即使使用git prune,我的存储库仍然有松散的对象。如果您遇到这种情况,git gc doc 表示它会非常努力确保安全并保留任何可能的引用。确保清理您可能在 .git 文件夹中找到的 /refs、/logs、FETCH_HEAD 和其他缓存。然后重新运行git gc --prune=now 就可以了。
    【解决方案2】:

    在将提交(或一般的对象)解压缩为松散对象并以这种方式放置至少 2 周之前,它们实际上不会被删除。您可以使用git gc --prune=now 跳过 2 周的延迟。

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

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

    【讨论】:

    • 试过了,仍然没有收集到提交。
    • @LopSae:您是否尝试过运行 git fsck --unreachable 以确保您的提交确实无法访问?
    • 刚试了没显示,说明从某处可以到达,但从哪里找不到。
    • @LopSae:你可以试试git describe --all --contains &lt;hash&gt;
    • 哈哈,是的,我做到了,我在响应中替换了“哈希”,只是为了不弄乱 cmets。
    猜你喜欢
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多