假设我在我的本地存储库中创建一个名为
feature1 的分支,基于 master 并添加了一两个提交。 然后我切换回 master 并决定删除分支 feature1 。
我认为分支基本上是指向特定提交对象的“指针”。
现在进入实际问题。
- 上述假设是否正确,或许在某种简化意义上是正确的?
- 提交对象在文件系统上存在多长时间(以便稍后执行
git checkout SHA1-HERE )? 是否有某种“保留政策”会删除不属于任何现有分支历史记录或标记的提交(不确定是否使用正确的术语...)?
- 上述内容是否取决于git服务器的实现(例如gitosis,github等)?
- 如果对象永远保持不变,并且在某些时间/事件之后不会自动清除,那么这是否意味着将git的receive.denyNonFastForwards设置为防止数据丢失的措施毫无意义?
这个问题的原因:我目前正在开展一个项目,该项目对 receive.denyNonFastForwards 进行了执行,因为这可以避免丢失任何已提交的工作(我怀疑还强制执行 receive.denyDeletes )。 我想确保没有更好的方法来保留提交但未合并的工作,并且能够清理旧分支以避免混乱。
man git-gc
和man git-reflog
是缺失的拼图。那么,阻止服务器回收松散对象而不是拒绝分支删除是否更有意义呢?实际上,你很少(甚至可以说从未)推送一个变基,所以不会有成千上万的松散对象挂在周围... - Robert Rossmanngit gc
自动运行时,它似乎默认使用--prune
,并且默认为2周。这就是为什么我认为如果一个孤立的提交不在我的reflog中,那么它可能不会持续超过2周。听起来你是说它仍然会持续90天?如果是的话,我不明白为什么它不会被gc'd。 - TTTgit maintenance
所取代,我在https://dev59.com/o6Pia4cB1Zd3GeqP5-7h#64077241和https://dev59.com/o6Pia4cB1Zd3GeqP5-7h#64627726中提到。它将通过批处理(https://git-scm.com/docs/git-maintenance#Documentation/git-maintenance.txt-loose-objects)处理这些相同的松散对象,而不是采用“停止世界”的方法。 - VonC