Dav*_*Far 5 language-agnostic git data-structures
为了更好地理解 git stash,我想知道: git stash 的元素存储在哪里以及存储在什么数据结构中?在堆栈中?在有序集合中?
细节:
每个文档、文章和书籍(除了Git Internals)都说 git stash 是一个stack。
最近,我发现您可以从存储中以任意顺序检索和删除元素——多么有用的功能。由于此功能和A Hacker's Guide to Git,在我看来,藏匿处更像是由某处按时间顺序排列的一组引用组成。但是,.git/refs/stash仅以合并提交的形式存储最新的 stash 元素(它还包含创建 stash 元素的日期)。
是否有另一个(绝密预索引存储缓存;)数据结构保存所有存储元素?或者 git stash (list|pop|apply) 是否从其常规对象存储中检索元素?如何?
那么 stash 元素形成什么数据结构呢?元素的时间顺序是否由合并提交的日期隐式给出?如果元素实际上存储在堆栈中,那么git如何以任意顺序检索和删除元素?
正如ElpieKay 在评论中所写,除了当前存储之外的所有内容都存储在引用日志中以供参考 refs/stash。请参阅gitglossary中“ref”和“reflog”的定义。请注意,分支名称(如master和 )develop是一种引用,分别是全名refs/heads/master和 的缩写refs/heads/develop。标签名称是另一种参考;标签v2.2确实是参考refs/tags/v2.2。
大多数参考文献都带有前缀refs/。事实上,各种 HEAD\xe2\x80\x94HEAD本身以及MERGE_HEAD、CHERRY_PICK_HEAD、ORIG_HEAD等 \xe2\x80\x94 是唯一的例外,其中大多数没有引用日志。 HEAD是唯一一个这样做的。
通常,引用日志条目只是简单地线性编号:HEAD@{1}或者是“最近更新之前的master@{1}提交”,是两步前的提交,等等。这在gitrevisions中有描述。为了方便起见,当前值可以用:引用,并且始终解析为相同的哈希 ID。如果引用的使用方式与其他引用相同,它将作为队列工作,而不是堆栈\xe2\x80\x94,但它不是这样使用的。相反,代码显式删除HEADmastermaster@{2}@{0}master@{0}masterrefs/stashgit stash早期条目。
由于编号始终是连续的,因此删除条目会导致所有较高的数字减一。比如说你手动删除的话master@{5},以前的master@{6}就是现在的master@{5},以前的master@{7}就是现在的master@{6},等等。
当然,添加一个新条目会将所有内容推高一级。因此,当您创建一个新的存储库时,以前的存储库stash现在stash@{0}是stash@{1}。以前的就是stash@{1}现在的stash@{2},等等。与其他转发,例如master,没有人称之为“推送”,它只是正在运行的普通队列。
但是,一旦删除 stash@{0}aka stash,所有较高的条目\xe2\x80\x94 stash@{1}、stash@{2}、等等\xe2\x80\x94 都会下降一,所以现在stash已被“弹出”,而前一个stash@{1}只是stash。当然,您也可以git stash drop stash@{4}删除该特定条目,保留 0 到 3 并重新编号 5 及以上。注意git stash pop任何特定的存储都仅意味着“应用,如果看起来成功,则丢弃”。
请注意,并非完全偶然,每个引用日志条目还附加了一个时间戳。您可以编写master@{yesterday}或master@{3.hours.ago},Git 将根据时间戳找到相应引用日志条目的哈希 ID。1 由于存储标识符只是引用日志条目,因此相同的语法也适用。(我实际上从未发现这一切在任何地方都有用,也许是因为我在工作时没有时间观念,并且不记得现在是一周中的哪一天,更不用说当我早些时候做某事时了。:-))有了这些时间戳,大多数引用日志就会过期:默认情况下,旧的引用日志条目将在 90 天后消失,如果无法从同一引用的当前值访问它所指定的对象,则仅在 30 天后消失。2 但是,默认refs/stash情况下,其本身不受此到期限制。所有这些都是可配置的:请参阅文档gc.reflogExpire中的所有设置git config设置。
1如果您一天内多次更新参考,但每小时不超过一次,则@{yesterday}表示@{24.hours.ago}。如果您每小时更新一次以上,请再乘以 60:@{1440.minutes.ago}。如果每分钟更新一次以上,请再次乘以 60:@{86400.seconds.ago}。该决议没有比这更好的了。
2git rebase例如 ,Git 就是这样保留 30 天但最终清除被 放弃的旧提交的。可到达性是由存储库中的标签、提交和树对象形成的有向无环图或 DAG 提供的一个关键概念。(Blob 位于DAG中,但不参与扩展它,因为它们始终是叶节点。因此 Blob 本身可能可达或不可达,但它绝不会影响任何其他节点的可达性对象的可达性。)
| 归档时间: |
|
| 查看次数: |
1061 次 |
| 最近记录: |