是否可以在运行git filter-branch后检索存储?

问题描述 投票:1回答:1

我运行git filter-branch --env-filter 'GIT_COMMITTER_DATE=$GIT_AUTHOR_DATE'以在重新确定基准后确定提交日期。但是,我不知道我的藏匿处会丢失。

我尝试了以下操作:

  • 运行git reflog --all,检查它显示的最早提交(c9e4e26 HEAD@{37}: rebase (start): checkout e3536c9^)并运行git stash list
  • 运行git fsck,检出每个不可达/悬垂的blob,然后提交并运行git stash list

有没有办法检索该藏匿处?

git git-stash git-filter-branch
1个回答
2
投票

您现有的存储藏不完全是丢失。好吧,很难找到,所以从这个意义上讲,它是“丢失”的。发生的是git filter-branch已对其进行[[damaged。 git stash的工作是进行两次(有时是三次)提交,其中的一个看起来像合并提交。大多数Git命令将其as合并。包括git filter-branch。因为git stash本身需要这些奇怪形式的提交块,所以这可能会损坏存储组-它们看起来像合并,但不能视为合并。

由于Git中的任何内容实际上都不能

change

任何现有的提交,因此,筛选分支所做的是将存储复制到新的和“改进的”(但实际上是损坏的)提交中。现在,名称stash指的是这些新的未改进的(未批准的?堕落的?)提交。如果您还没有破坏所有的refs/original空间:

git update-ref refs/stash refs/original/refs/stash

refs/stash恢复到过滤器分支操作之前的状态。 (这假设单次传递filter-branch;每增加一次传递将需要-f或删除先前的refs/original/空间,这两个空间都会破坏您想要在此处返回的值。)

如果您使用的是隐藏的“堆栈”,则在refs/stash本身的引用日志中。除最后一项stash@{1}应保持过滤分支操作之前的refs/stash的旧值外,它应该没有损坏。如果您[[have

破坏了refs/original名称,则提供了另一种恢复方法。如果您多次运行git filter-branch,则此处所需的数字可能会比1大。

如果所有其他方法均失败,则可以使用[[恢复错误地清除/删除的存储项末尾处的git fsck中描述的the git stash documentation方法,但很痛苦。

(顺便说一句–并非在

this

上有帮助-这是我大多数时候推荐avoiding git stash的许多原因之一。由于它所做的只是提交,所以只需进行普通提交。Git的其余部分将很好地处理这些常规提交。)
© www.soinside.com 2019 - 2024. All rights reserved.