【问题标题】:why doesn't my git reflog go back up to clone为什么我的 git reflog 不回去克隆
【发布时间】:2018-02-08 02:07:14
【问题描述】:

我有一个关于 git reflog 的问题:

在我的项目开始时,当我执行 git reflog 时,我能够看到我原来的 git clone 命令的所有步骤。

今天,git reflog 不再返回到 git clone 命令。

更准确地说,git reflog 返回 4143 行,最后几行被截断:

$ git reflog
6146d34 HEAD@{0}: checkout: moving from feature/cluster to feature/config
[...]
cb14a86 HEAD@{4140}: checkout: moving from master to demo/20170529
b2ef8d6 HEAD@{4141}: checkout: moving from master to demo/20170529
b2ef8d6 
$ 

谁能解释一下为什么?

有没有办法获得整个 reflog?

非常感谢,

朱利安

【问题讨论】:

  • 它不希望人们在问题的开头随意打招呼。
  • 关于您的实际问题,我的理解(也许有缺陷)可以定期清除 reflog。换句话说,如果你不小心对一堆提交进行了核对,你会发现它们在 reflog 中是安全可靠的,但它们可能会在以后被垃圾收集。这不是一个完整的答案,我也找不到任何文档,但你不应该依赖 reflog 作为你所做的每一次提交的永久记录。

标签: git git-reflog reflog


【解决方案1】:

正如其他人所指出的,reflog 在设计上是临时的。我会添加这个:

您可以调整影响 reflog 条目保留时间的配置设置,但即便如此,您也应该将它们视为临时的,因为 reflog 是严格本地的 - 也就是说,它们不会通过推送(或来自获取/拉取的远程),而是跟踪 refs 的历史仅在本地克隆上。因此,如果您不得不替换本地 repo,无论您的配置如何设置,您都会丢失所有的 reflog。

更新以回应 cmets 中的后续问题:相关设置(此处记录:https://git-scm.com/docs/git-config)是

gc.reflogExpire
gc.<pattern>.reflogExpire
gc.reflogExpireUnreachable
gc.<pattern>.reflogExpireUnreachable

【讨论】:

  • 能否提供相应的设置?谢谢!
【解决方案2】:

@TimBiegeleisen 说得对,reflog 会定期清空。只要 reflog 包含对其他无法访问的提交的引用,它们仍然会保留在您的存储库中。仅当从 reflog 中删除提交引用(“过期”)时,提交才会被垃圾收集,因此完全消失。如果这不会发生,来自已删除分支的提交将永远存在。

由于此类“悬空”提交和其他未使用的引用已从您的存储库中删除,并且没有记录存储库的本地历史记录,因此您无法追溯获取存储库的整个 reflog。

编辑:找到here

引用日志会一直保留到过期(这可以通过 git reflog 来完成 过期命令)。不可达提交的默认值为 30 天(或 gc.reflogExpireUnreachable 配置值)或者,对于可达 提交,90 天(或 gc.reflogExpire 配置值)。

这得到确认here,正如您在示例中看到的那样,您还可以设置reflogExpire = never 以永不让可访问的引用日志条目过期。但是,这不会使您已经修剪的 reflog 恢复原状,而只能防止将来被删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 2013-08-07
    • 1970-01-01
    • 2016-10-10
    • 1970-01-01
    • 2010-10-22
    • 2011-10-17
    相关资源
    最近更新 更多