Git是否真的会破坏提交或只是孤立它们?我知道git垃圾收集器将在git config中设置的任何时间间隔内使用git gc
运行时删除孤立提交。是否有其他案例会删除提交?
答案 0 :(得分:2)
Git可能真的会破坏某些对象,包括最终的未提交的提交;但它可能不会。仔细阅读到底为什么会这样。
通过git prune
,git repack
和git 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
具有删除孤立对象的明确任务声明。