【问题标题】:How many / how long are stashes saved by git?git保存了多少/多长时间?
【发布时间】:2014-10-04 07:54:55
【问题描述】:

我对 git 很陌生,对存储有一些疑问。如果我在一个分支上工作但无法到达可以提交分支的位置,那么存储是正确的使用方法。我关于存储的问题是:

  1. 保存了多少存储?
  2. 这些存储可以保存多长时间?
  3. 他们是否只是临时保存工作,以便在您重新启动计算机时丢失更改?

如果有人能迅速帮助澄清这些,将不胜感激。

【问题讨论】:

  • 1.你创造多少。 2. 只要您不droppopclear 它们。 3.没有;重新启动后仍然可以访问存储。见git-scm.com/book/en/Git-Tools-Stashing
  • 反对者,这个问题可能比你想象的更微妙......
  • 在 git 中,您几乎永远不会处于无法提交的位置。我个人认为 stash 并不是那么有用。

标签: git git-stash


【解决方案1】:

1 - 保存了多少存储?

藏匿处不会凭空出现;仅当您创建它们时,使用

git stash

或者,等价的,

git stash save

那么有多少得救了?创造多少就多少。

2 - 这些存储可以保存多长时间?

这个问题看起来很无辜,但答案其实很微妙。这里有两个方面需要考虑:1) stash reflog,以及 2) 存储库的对象数据库。

当你创建一个存储时,Git

  • 向 stash reflog 添加一个条目,
  • 在存储库的数据库中创建两个(如果使用--include-untracked 标志,则为三个)提交对象:一个对应于工作树中的 WIP(正在进行的工作),另一个对应于暂存区的状态(又名索引)。

编辑:那些提交对象是真正的提交,可以通过在它们上运行git cat-file -t 来验证。他们只是碰巧无法从任何分支访问;见torek's comment

默认情况下,Git 的垃圾回收会自动删除超过 90 天的 reflog 条目;您可以通过运行为 stash reflog 条目指定不同的“生命周期”

git config gc.refs/stash.reflogexpire <lifetime>

不过,as torek notes,Git 会专门处理存储 - 即使旧的 reflog 条目通常会自动删除,但 Git 永远不会删除 refs/stash 的 reflog 条目,除非你明确告诉它这样做。

换句话说,Git 不会自行删除存储;只要您不自愿,存储库就会保留在您的本地存储库中

  • 放下它,使用

    git stash drop <stash-reference>
    

    从 stash reflog 中删除指定的 stash 条目;

  • 弹出它,使用

    git stash pop <stash-reference>
    

    应用指定的存储,然后从存储引用日志中删除相应的条目;或

  • 运行

    git stash clear
    

删除 所有 stash reflog 条目(小心那个)。

但是,请注意,这三个操作仅影响 stash reflog。特别是,它们不会立即导致关联的“WIP”和“索引”对象从存储库的数据库中删除;它们只是使这些对象无法访问。后者将在“存储库边缘”中停留一段时间,直到它们最终被垃圾收集并“真正死亡”。

这是一件有用的事情:如果你不小心丢弃一个存储,你仍然可以从你的 repo 的内脏中检索它,如果你能记住或识别它的两个 SHA对象(WIP 和索引)。

3 - 他们是否只是临时保存工作,以便在您重新启动计算机时丢失更改?

没有。 Stashes 与任何其他提交对象没有什么不同;重新启动对它们没有影响。

【讨论】:

  • 旁注:它们不仅仅是“类似提交的对象”,它们实际上是提交:它们只是在 no 分支上的提交。我会说“创建两个提交”而不是“创建两个类似提交的对象”。而且,stash ref 有一个特殊的不寻常默认到期时间“从不”。
  • @torek 我不得不仔细检查git cat-file -t,但你对这些对象的提交是正确的。但是,文档中的哪里提到 stash 引用不会过期?
  • 它的记录是最差的,也许除了发行说明之外根本没有。在builtin/reflog.c 中是这个位,但是:if (!strcmp(ref, "refs/stash")) { 带有将到期时间设置为“永不”的代码,并且注释:“如果未配置,则使存储永不过期”。不过,在将到期时间设置为“从不”之前,我并不完全清楚 if 内部的附加代码(此处未显示)正在测试什么。
  • @torek 这是一个很棒的发现。这是您在 Github 上引用的实际代码行的 link
  • @torek 其他行正在检查用户是否明确传递了以下标志:[--expire=&lt;time&gt;] [--expire-unreachable=&lt;time&gt;]。如果他们没有通过这些标志之一,它将设置为零(即从不)。否则,将应用传递的标志并且不应用默认值。对于其他 reflog,您将在下面直接看到类似的逻辑(当然不是设置为零,而是设置为默认值)。
【解决方案2】:

Git 存储会一直保存到您的硬盘死掉(与提交不同,提交通常通过git push 传输到其他计算机,因此会比硬盘故障更有效)。

您可以拥有任意数量的存储空间。通过运行 git stash dropgit stash clear 摆脱旧的,当你喜欢它时(阅读这些文档)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多