git会保留多久分支外的提交记录?

13
假设我在我的本地存储库中创建一个名为 feature1 的分支,基于 master 并添加了一两个提交。 然后我切换回 master 并决定删除分支 feature1 。
我认为分支基本上是指向特定提交对象的“指针”。
现在进入实际问题。
  1. 上述假设是否正确,或许在某种简化意义上是正确的?
  2. 提交对象在文件系统上存在多长时间(以便稍后执行 git checkout SHA1-HERE )? 是否有某种“保留政策”会删除不属于任何现有分支历史记录或标记的提交(不确定是否使用正确的术语...)?
  3. 上述内容是否取决于git服务器的实现(例如gitosis,github等)?
  4. 如果对象永远保持不变,并且在某些时间/事件之后不会自动清除,那么这是否意味着将git的receive.denyNonFastForwards设置为防止数据丢失的措施毫无意义?
这个问题的原因:我目前正在开展一个项目,该项目对 receive.denyNonFastForwards 进行了执行,因为这可以避免丢失任何已提交的工作(我怀疑还强制执行 receive.denyDeletes )。 我想确保没有更好的方法来保留提交但未合并的工作,并且能够清理旧分支以避免混乱。
1个回答

13

默认 s 为90天:

gc.reflogexpire
gc.<pattern>.reflogexpire

git reflog expire会删除早于指定时间的reflog记录, 默认为90天。在"<pattern>"(例如"refs/stash")中间加上设置后,只适用于与<pattern>匹配的引用。

所以:

  1. 是的
  2. 90天
  3. 不是(实际上您可以联系GitHub支持请求他们来恢复已删除的推送分支)
  4. “保留已提交但未合并的”:您可以将其推送到专用的开发分支或专用的上游存储库(仅供您使用)

2
谢谢,man git-gcman git-reflog是缺失的拼图。那么,阻止服务器回收松散对象而不是拒绝分支删除是否更有意义呢?实际上,你很少(甚至可以说从未)推送一个变基,所以不会有成千上万的松散对象挂在周围... - Robert Rossmann
我认为区分自己机器上的 reflog 和孤立提交在别人机器上挂起的时间可能会有所帮助。如果 OP 推送了他的分支,然后进行了变基或删除操作,那么这些孤立提交默认情况下将在 OP 机器上的 reflog 中保留 90 天,在其他已经从远程获取它们的人机器上只保留 2 周。 - TTT
@TTT 为什么要两周?reflog 总是本地的。 - VonC
也许我被这样一个事实搞糊涂了,即当git gc自动运行时,它似乎默认使用--prune,并且默认为2周。这就是为什么我认为如果一个孤立的提交不在我的reflog中,那么它可能不会持续超过2周。听起来你是说它仍然会持续90天?如果是的话,我不明白为什么它不会被gc'd。 - TTT
1
@TTT 但是这两周是用于松散对象(不在packfile中的对象:https://git-scm.com/book/en/v2/Git-Internals-Maintenance-and-Data-Recovery),而不是孤立对象(由reflog引用)。此外,git gc将很快被git 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
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接