在GitHub上,您可以恢复/还原已删除的分支的时间有多长?

39

这不是关于如何在Github中恢复丢失分支的问题,而是关于以下用户案例故事中删除分支后你需要多长时间才能恢复它:

在拉取请求中(通常用作代码审查的地方),分支可以在github GUI中合并然后删除。如果你选择删除它,你会看到一个粗体和带下划线的单词 "restore",表示你有恢复该分支的选项。

我怀疑这个选项可能有一个时间限制,Github不会无限期地保留它。

Github是否有对此设定时间限制?如果有的话,那么时间限制是多久?


1
看起来所有的答案都涵盖了创建拉取请求的情况。如果我从未创建拉取请求,并直接在 Github UI 中删除分支,会发生什么?(假设我没有本地克隆)。 - Marcello Romani
1
在这种情况下,我非常怀疑它已经消失了。@MarcelloRomani。他们可能会定期运行git gc以清除无法访问的内容。 - BlackVegetable
3个回答

55

我向GitHub支持提问,这是他们的回答(重点是我的):

我们为所有拉取请求使用单独的ref命名空间,用于各种事情,包括恢复分支。由于我们无限期保留这些[拉取请求]引用,因此恢复分支没有时间限制

您可以通过使用以下内容在远程中查看这些特殊引用:

$ git ls-remote | grep pull
From git@github.com:<username>/<remote>.git
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa        refs/pull/1/head
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb        refs/pull/1/merge
cccccccccccccccccccccccccccccccccccccccc        refs/pull/2/head
dddddddddddddddddddddddddddddddddddddddd        refs/pull/2/merge

引用被命名空间化为refs/pull/<pull request number>/head引用指向正在拉取请求的分支的末端,即分支上的最后一次提交。但我不确定merge引用是什么。


1
“merge” 分支似乎是与主分支试合并的缓存。 git fetch origin bbbbbbbb; git log --oneline --graph bbbbbbbb - Brian Reichle

6

GitHub的支持团队可能会有一个确定的答案,但我怀疑它基于默认的90天期限,在此之前reflog将自动清除。

gc.<pattern>.reflogexpire

git reflog expire会删除早于这个时间的reflog条目;默认为90天
在"<pattern>"(例如"refs/stash")中间,该设置仅适用于与<pattern>匹配的引用。

但是...如果您有一个声明了该分支的本地副本...没有任何东西会阻止您将该分支推回gitHub repo ;)

Cupcake答案(已投票)给出了这个支持答案:没有限制,这意味着这两个设置都被设置为never

  • gc.reflogexpire
  • gc.reflogexpireunreachable
这对于一个托管仓库服务而言是有道理的,因为它不会在本地修改这些仓库,只会存储来自外部贡献者推送的修改。

更新Git 2.22(2019年第二季度,五年后):最后一种情况(将gc.reflogexpiregc.reflogexpireunreachable设置为never)得到更好的处理。

请参阅提交bf3d70f, 提交978f430 (2019年3月28日), 提交fe66776, 提交a65bf78, 提交cd8eb3a, 提交e5cdbd5 (2019年3月15日) 和 提交8bf1444 (2019年3月13日),作者为Ævar Arnfjörð Bjarmason (avar)
(由Junio C Hamano -- gitster --合并于提交f3c19f8, 2019年4月25日)

gc: 处理和检查 gc.reflogExpire 配置

gc.reflogExpiregc.reflogExpireUnreachable 被设置为 "never" 时,不要多余地运行 "git reflog expire --all",如果这些配置值不好,则立即终止。

正如早期对于 "git reflog expire" 的测试所显示的那样,一般情况下不希望提前检查 gc.reflogExpire{Unreachable,},但对于 "gc" 来说是有意义的,因为:

  1. 8ab5aa4 ("parseopt: 更好地处理格式不正确的 --expire 参数", 2018-04-21, Git v2.18.0-rc0) 类似,我们现在会在配置变量设置为无效值时立即终止。
    我们在 "reflog expire" 之前运行 "pack-refs",这可能需要一段时间,只是为了在 gc.reflogExpire{Unreachable,} 配置无效时立即终止。

  2. 根本不调用该命令意味着它不会出现在跟踪输出中,这使得当两者都设置为 "never" 时更容易理解正在发生的事情。

  3. 正如后来的更改所记录的那样,在循环过期的引用时,即使由于此配置我们最终什么也没做,我们也会锁定引用。


6
请注意,GitHub 上的一些拉取请求页面不会显示删除/恢复分支按钮,即使引用已经被Cupcake描述安全存储。
这可能意味着同一分支在稍后的拉取请求中再次使用。在 GitHub 中搜索存储库的分支名称并检查该分支上的最新拉取请求。您应该会在那里找到恢复(或删除)分支的 UI。

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