是否有任何git命令会明确地销毁提交?
Git是否真的会摧毁提交或者只是孤儿?我知道,git垃圾收集器将删除孤立的提交时运行与git gc
在任何间隔设置在git配置。是否还有其他情况会删除提交?是否有任何git命令会明确地销毁提交?
Git最终可能会真正销毁一些对象,包括未提交的提交;但它可能不会。为了达到这个目的,请仔细阅读。
最直接的控制可通过git prune
,git repack
和git prune-packed
获得。运行git gc
运行所有这些,以及更多。假设git prune
或甚至是git gc --prune=now
将会诀窍的主要问题是现在无法访问的对象可能是打包的。
通常,您应该首先终止reflogs,因为删除过期的reflog条目可能会导致对象无法访问。使用git gc
以相对安全的方式以正确的顺序完成所有这些工作:首先过滤reflogs,然后修剪(仔细地),然后重新打包,然后修剪打包。 prune
步骤宽松未参考的对象自己过期。 之后,其他步骤重新包装正在使用的旧对象,并删除刚刚打包的对象。
这一系列事件就是为什么我们需要git repack -d
或甚至-ad
,其次是git prune-packed
。但是,如果某些包标有.keep
文件,则这些包将保留,如果包含其他未引用的对象,则这些对象也将保留。
由于多个GIT中的命令可以并行地运行,这是明智的提供,在此期间未引用的对象住,在情况下,他们将要成为引用的宽限期。请注意,它是git gc
,它插入默认的14天宽限期; git prune
默认为--expire=now
而不是--expire=2.weeks.ago
。这给Git命令336小时完成他们的工作和水泥参考:例如,git commit
运行git write-tree
其次是git commit-tree
,并且此树和提交都未被引用,直到git commit
也更新当前分支名称。通常情况下,整个过程只需要几毫秒,因此336小时应该足够的时间。