3

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

非常感谢,

朱利安

4

2 回答 2

3

正如其他人所指出的,reflog 在设计上是临时的。我要补充一点:

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

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

gc.reflogExpire
gc.<pattern>.reflogExpire
gc.reflogExpireUnreachable
gc.<pattern>.reflogExpireUnreachable
于 2017-08-30T12:27:56.860 回答
2

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

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

编辑:在这里找到:

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

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

于 2017-08-30T11:32:05.597 回答