是否有任何 git 命令会显式销毁提交?

Are there any git commands that will explicitly destroy a commit?

Git 是否真正销毁了提交或只是孤立了它们?我知道 git 垃圾收集器将在 运行 和 git gc 时删除孤立的提交,无论在 git 配置中设置什么时间间隔。还有其他情况会删除提交吗?

git-prune 有删除孤立对象的明确任务说明。

Git 最终可能会真正销毁某些对象,包括未引用的提交;但它可能不会。通读到底为什么会这样。

最直接的控制是通过 git prune, git repack, and git prune-packed. Running git gc 运行 所有这些,甚至更多。假设 git prune,甚至 git gc --prune=now 会起作用的主要问题是现在无法访问的对象可能已被 打包

一般来说,您应该首先使引用日志过期,因为删除过期的引用日志条目可能会导致对象无法访问。使用 git gc 以相对安全的方式以正确的顺序完成所有这些操作:首先过期引用日志,然后是 p运行e(小心),然后重新打包,然后是 p运行e-打包。 prune 步骤抛出 松散 未引用的对象 并且它们自己已过期 1 之后,其他步骤重新打包正在使用的旧对象,并删除刚刚打包的对象。

这一系列事件就是为什么我们需要 git repack -d,甚至 -ad,然后是 git prune-packed。但是,如果某些包标有 .keep 文件,则这些包将保留,如果它们包含其他未引用的对象,则这些对象也将保留。


1由于多个 Git 命令可能是 运行 并行的,明智的做法是提供一个宽限期,在此期间未引用的对象继续存在,以防万一他们即将成为参考。请注意,插入默认的 14 天宽限期的是 git gcgit prune 默认为 --expire=now 而不是 --expire=2.weeks.ago。这给 Git 命令 336 小时来完成他们的工作和巩固参考:例如,git commit 运行s git write-tree 后跟 git commit-tree,以及这棵树和提交未被引用,直到 git commit 也更新当前分支名称。正常情况下,整个过程只需要几毫秒,所以336小时应该足够了。