有没有明确销毁提交的git命令?

时间:2017-11-17 21:52:13

标签: git git-reset

Git是否真的会破坏提交或只是孤立它们?我知道git垃圾收集器将在git config中设置的任何时间间隔内使用git gc运行时删除孤立提交。是否有其他案例会删除提交?

2 个答案:

答案 0 :(得分:2)

Git可能真的会破坏某些对象,包括最终的未提交的提交;但它可能不会。仔细阅读到底为什么会这样。

通过git prunegit repackgit prune-packed可以获得最直接的控制。运行git gc会运行所有这些,以及更多。假设git prune甚至git gc --prune=now的主要问题是,现在无法访问的对象可能已经打包

通常,您应该首先使reflogs到期,因为删除过期的reflog条目可能会导致对象无法访问。使用git gc以相对安全的方式以正确的顺序完成所有这些:首先使reflogs过期,然后修剪(小心),然后重新包装,然后修剪。 prune步骤抛出松散未引用的对象并且自身已过期 1 之后,其他步骤重新包装旧对象在使用中,并删除刚刚被打包的对象。

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

1 由于可以并行运行多个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小时应该有足够的时间。

答案 1 :(得分:1)

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