git保存了多长时间/多长时间?

mat*_*ath 19 git git-stash

我对git很新,并对存储有一些疑问.如果我在一个分支机构工作但是无法到达我可以提交分支的位置,那么使用存储是正确的.我关于藏匿的问题是:

  1. 保存了多少个藏匿处?
  2. 这些藏匿处存放了多长时间?
  3. 他们只是暂时保存工作,以便在重新启动计算机时丢失更改吗?

如果有人可以迅速帮助澄清这些将非常感激.

jub*_*0bs 26

1 - 保存了多少个藏匿处?

圣物不会出现在空气中; 只有你创建它们,使用

git stash
Run Code Online (Sandbox Code Playgroud)

或者,等效地,

git stash save
Run Code Online (Sandbox Code Playgroud)

那么有多少人被救了?和你一样多.

2 - 这些藏匿处存放了多长时间?

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

当你创建一个藏匿,Git

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

编辑:那些提交对象是真正的提交,可以通过运行来验证git cat-file -t.他们碰巧无法从任何分支机构到达; 看到torek的评论.

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

git config gc.refs/stash.reflogexpire <lifetime>
Run Code Online (Sandbox Code Playgroud)

除了上面描述的垃圾收集机制,Git不会自行删除存储区; 只要您不自愿,存储将保留在您的本地存储库中(至少90天)

删除存储reflog的所有条目(小心那个).

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

这是一个有用的事情要知道:如果你不小心丢下一个藏品,你仍然可以从你的仓库的内脏中检索它,如果你能记住或识别它的两个对象(WIP和索引)的SHA.

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

不存在与任何其他提交对象没有区别; 重启对他们没有影响.

  • 它记录得很糟糕,也许除了发行说明之外别无其他.在`builtin/reflog.c`中是这样的,但是:`if(!strcmp(ref,"refs/stash")){`用代码将到期时间设置为"never",注释:"如果未配置,使存储永不过期".我不完全清楚"if"中的附加代码(此处未显示)是否正在测试,但在将"到期"设置为"从不"之前. (8认同)
  • 旁注:它们不仅仅是"类似提交的对象",它们实际上是提交:它们只是提交*no*branch.我会说"创建两个提交"而不是"创建两个类似提交的对象".并且,`stash` ref有一个特殊的异常默认到期时间为"never". (4认同)
  • @torek我必须仔细检查“git cat-file -t”,但你对这些对象的提交是正确的。但是,文档中的哪里提到“stash”引用不会过期? (2认同)
  • @torek 这是一个很棒的发现。这是您在 Github 上引用的实际代码行的 [链接](https://github.com/git/git/blob/6a269e52a5d0c82567c5b39cc194cc90f9fa9156/builtin/reflog.c#L497-L506)。 (2认同)