【发布时间】:2018-05-01 18:31:45
【问题描述】:
Git 是否真正销毁提交或只是孤立提交?我知道 git 垃圾收集器在 git config 中设置的任何时间间隔上使用git gc 运行时都会删除孤立的提交。还有其他情况会删除提交吗?
【问题讨论】:
Git 是否真正销毁提交或只是孤立提交?我知道 git 垃圾收集器在 git config 中设置的任何时间间隔上使用git gc 运行时都会删除孤立的提交。还有其他情况会删除提交吗?
【问题讨论】:
Git 最终可能会真正销毁某些对象,包括未引用的提交;但它可能不会。通读到底,了解为什么会这样。
通过git prune、git repack 和git prune-packed 可以进行最直接的控制。运行 git gc 运行所有这些,以及更多。假设git prune 甚至git gc --prune=now 可以解决问题的主要问题是,现在无法访问的对象可能已打包。
一般来说,您应该首先使 reflog 过期,因为删除过期的 reflog 条目可能会导致对象无法访问。使用git gc 可以以相对安全的方式以正确的顺序完成所有这些工作:首先过期 reflog,然后修剪(小心),然后重新打包,然后进行修剪打包。 prune 步骤丢弃未引用的松散对象本身已过期。1之后,其他步骤重新打包正在使用的旧对象,并删除刚刚打包的对象。
这一系列事件就是为什么我们需要git repack -d,甚至是-ad,然后是git prune-packed。但是,如果某些包标有 .keep 文件,则这些包将保留,如果它们包含其他未引用的对象,则这些对象也将保留。
1由于可以并行运行多个 Git 命令,明智的做法是提供一个宽限期,在此期间未引用的对象将继续存在,以防它们即将被引用。请注意,插入默认的 14 天宽限期的是 git gc; git prune 默认为 --expire=now 而不是 --expire=2.weeks.ago。这给了 Git 命令 336 小时来完成它们的工作并巩固引用:例如,git commit 运行 git write-tree 后跟 git commit-tree,并且在 git commit 也更新当前分支名称之前,此树和提交是未引用的。通常,整个过程只需几毫秒,因此 336 小时应该足够了。
【讨论】:
git-prune 具有删除孤立对象的明确使命声明。
【讨论】: