为什么我的git reflog不会重新克隆

时间:2017-08-30 11:21:46

标签: git git-reflog reflog

我有一个关于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?

非常感谢,

于连

2 个答案:

答案 0 :(得分:1)

@TimBiegeleisen没错,reflog会定期清空。只要reflog保存对其他无法访问的提交的引用,它们仍将保留在您的存储库中。只有当提交引用从reflog('expired')中删除时,提交才会被垃圾收集,因此完全消失。如果不这样做,来自已删除分支的提交将永远存在。

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

修改:找到here

  

reflogs一直持续到期(可以使用git reflog完成)   到期命令)。无法到达提交的默认值为30天(或   gc.reflogExpireUnreachable配置值)或者,可达   提交,90天(或gc.reflogExpire配置值)。

这已得到确认here,正如您在示例中所看到的,您还可以将reflogExpire = never设置为永不让可访问的reflog条目到期。但是,这可能不会使您已经修剪的reflog回来,但只会阻止将来删除。

答案 1 :(得分:1)

正如其他人所指出的那样,reflogs在设计上是暂时的。我想补充一点:

您可以调整影响reflog条目保留时间的配置设置,但即使如此,您也应该将它们视为临时的,因为reflog是严格本地的 - 也就是说,它们不会在推送时转到远程(或者来自远程on fetch / pull),而是仅跟踪本地克隆上的ref 的历史记录。因此,如果您不得不更换本地存储库,无论您的配置如何设置,都会丢失所有的日志。

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

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