gpt4 book ai didi

git - 删除超过X天的 stash 更改

转载 作者:行者123 更新时间:2023-12-03 15:37:25 27 4
gpt4 key购买 nike

如何删除所有早于X天的 stash ?

我在日常工作流程中使用git stash,这意味着我将要花费数月的时间。

最佳答案

手动使用git reflog expire
“推送”存储的基 native 制(即名称不只是stashstash@{0},而是stash@{1}stash@{2}等的任何存储)是Git的reflogs。只要引用发生更改,reflog就会记录引用的先前值。 (我将在下面定义引用,并在那里完成reflog的定义。)

大多数reflog条目通过可配置的gc.reflogExpiregc.reflogExpireUnreachable设置自行失效(请参阅the git config documentationthe git reflog documentation)。但是,refs/stash引用很特殊:默认情况下,其条目永不过期,而不是30或90天后过期。

您可以手动运行git reflog expire并覆盖其中的任何一个。例如:

git reflog expire --expire-unreachable=40.days refs/stash

告诉Git终止至少40天的所有存储条目,这些存储条目始终无法访问(请参阅下面的详细信息)。在选项中添加 --dry-run可以查看哪些会过期,而实际上并不会过期...尽管这里有一个小缺陷:它不会打印其编号,即从不说会扔掉 stash@{17}

引用文献

Git的引用是分支名称,标签名称,远程跟踪分支名称以及Git具有的所有其他名称的概括。引用只是将名称(例如 masterv1.2stash)转换为Git的内部哈希ID之一。

分支名称只是一个引用,其全名以 refs/heads/开头。标签名称只是一个引用,其全名以 refs/tags/开头。远程跟踪分支名称是一个引用,其全名以 refs/remotes/开头(然后具有远程名称和另一个斜杠)。

一些引用名称,尤其是分支,经常更改。例如,您的 master分支(实际上是 refs/heads/master)在每次向 master添加新提交时都会更改。每当Git将存储的哈希值替换为引用时,它可能会(取决于是否已打开reflog)保存先前的哈希值。这些保存的条目是您的引用日志。

每个reflog条目都有一个时间戳。引用日志条目最终会过期并过期,因此您不会出现成千上万个引用日志条目的情况。

可到达和不可到达,以及为什么它们不适用于 refs/stash
分支名称通常以向前的方式移动,例如一次提交一次。也就是说,我们将新的提交添加到分支,而该分支上的所有旧提交仍在该分支上。有时,我们会以“快速”前进的方式提取并一次添加所有提交:所有新的提交都在分支上,而所有旧的提交也都在分支上。分支名称指向分支上的尖端提交,在此图中最右边的 o:
...--o--o--o   <-- branch

我们添加了更多提交,分支名称仍然指向提示:
...--o--o--o--o--o--o   <-- branch

但是由于每个提交都指向其父提交,因此所有这些提交都是可以到达的。

但是,有时我们会故意删除一个提交,然后用另一个替换。例如,如果我们有未推送的提交,则可以使用 git commit --amendgit rebase -i进行一些更改。当我们这样做时,旧的就不会消失,只会得到。相反,它们被推到一边:
...--o--o--X   <-- branch

变成:
          X ...... branch@{1}
/
...--o--o--Y <-- branch

其中 Y是我们替代 X的地方。

请注意, Y的父提交不是 X,而是 X的父提交。这意味着无法从 X到达commit Y

可访问对象和不可访问对象的两个单独的“reflogExpire”配置项指的是可以通过从引用的当前值开始(对于我们名为 branch的分支,即 refs/heads/branch)开始并向后工作的提交。提交 Y可以访问, o也是可以访问的,但是 X不能访问。如果有一个指向较早的 o之一的reflog条目,它是可以到达的,但是 branch@{1}指向不可达的 X

Git的设计师从本质上认为无法实现的提交不那么值得,因此他们的reflog条目应尽快过期。因此,对于无法访问的条目,默认值为30天,对于可访问的条目,默认值为90天。

但是, refs/stash引用完全无法正常前进。相反,它指向当前存储区,这是一种“袋式存储”:一次提交-实际上至少两次提交,有时更多次提交-不在任何分支上(我称其为“存储袋”;参见 How to recover from "git stash save --all"?)。反过来,这意味着从当前 stash@{n}到以前的 refs/stash都无法访问!因此,每个存储刷新日志条目始终都是无法访问的。

关于git - 删除超过X天的 stash 更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44817685/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com