是否可以在 运行 git 过滤器分支之后检索存储?

Is it possible to retrieve a stash after running git filter-branch?

I 运行 git filter-branch --env-filter 'GIT_COMMITTER_DATE=$GIT_AUTHOR_DATE' 以在我重新定位后修复提交日期。但是,我不知道我的藏品会丢失。

我试过以下方法:

有没有办法找回那个藏品?

您现有的藏品并不完全丢失。嗯,很难找到,所以从这个意义上说,它是 "lost"。发生的事情是 git filter-branch 损坏了 它。 git stash 所做的是进行两次(有时是三次)提交,其中关键的一次看起来像合并提交。大多数 Git 命令将其 视为 合并。其中包括 git filter-branch。这可能会损坏存储组,因为 git stash 本身需要这些奇怪的提交块——它们看起来像合并,但不能被视为合并。

由于 Git 中没有任何内容实际上可以 更改 任何现有的提交,但是,filter-b运行ch 所做的是将存储复制到新的和"improved"(但实际上,已损坏)提交。 stash 这个名字现在指的是这些新的和未改进的(deproved?depraved?)提交。

如果你还没有破坏所有 refs/original space:

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

会将 refs/stash 恢复到 filter-b运行ch 操作之前的状态。 (这假设单次通过 filter-branch;每次额外的通过都需要 -f 或删除之前的 refs/original/ space,其中任何一个都会破坏您想要返回此处的值.)

如果您使用的是存储 "stack",那是在 refs/stash 本身的 reflog 中。除了最后一个条目 stash@{1} 应该保持 filter-b运行ch 操作之前的旧值 refs/stash 之外,它应该没有损坏。这提供了另一种恢复方法,如果您 已经 破坏了 refs/original 名称。如果您 运行 多次通过 git filter-branch,您可能需要比此处 1 更高的数字。

如果所有其他方法都失败了,the git stash documentation 中描述的 git fsck 方法接近尾声 错误地 cleared/dropped 恢复存储条目 ,可用,但很痛苦。

(顺便说一句——这在 这个 点没有帮助——这是我建议 避免 git stash 的众多原因之一大多数时候。因为它所做的只是进行提交,所以只需进行正常提交。Git 的其余部分将很好地处理这些正常提交。)