我有一个关于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?
非常感谢,
于连
答案 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