git stash报告:''不是藏匿参考

Ham*_*ner 24 git git-stash

不太确定发生了什么,但是git stash似乎处于一个不好的地方.

% git stash list
stash@{0}: filter-branch: rewrite
stash@{1}: filter-branch: rewrite
stash@{2}: On mysolr: start mysolr stuff
Run Code Online (Sandbox Code Playgroud)

没关系,并且git show stash@{0}工作正常.但:

% git stash drop
'' is not a stash reference
% git stash pop
'' is not a stash reference
% git stash drop stash@{0}
'stash@{0}' is not a stash reference
Run Code Online (Sandbox Code Playgroud)

我过去常常使用git stash而不是碰到这个.我最近重写了历史记录,以便在发布到github之前从历史记录中删除文件.我跑的命令是

git filter-branch --force --index-filter \
  'git rm --cached --ignore-unmatch FILENAME' \
  --prune-empty --tag-name-filter cat -- --all
Run Code Online (Sandbox Code Playgroud)

任何想法如何修复藏匿?

tor*_*rek 25

我认为filter-branch已经打破了你的困境.如果参数git stash不足以像一个藏匿袋,你会得到那个not a stash reference投诉.

请注意,使用plain old ,它不要求作为参数提供的提交类似于存储.如果以与其他命令相同的方式失败,或者如果对有问题的存储的手动检查表明它不再是两个或三个父合并提交,那么事实上就是这种情况.git show stashrefgit showgit stash showgit stash

这可能--prune-empty是在这里做到的.如果您add在存储时没有编辑任何内容,则索引提交将为空.一般来说,避免过滤隐藏引用可能更明智.

您可以尝试两种不同的方法:

  • refs/original/(filter-branch离开它们的地方)和/或reflogs中恢复原始的存储SHA-1 ; 使用那些来重建refs/stash和/或存储reflog,或直接使用它们然后破坏stash ref及其reflog.
  • 在重写的stashes中仅使用剩余的工作树提交.所有你真正需要的,因为索引提交是空的,是一个工作树提交.您可以使用git show已经运行的命令获取补丁.

(关于藏匿和存储袋的更多信息,包括与--allor一起使用的三父表格--untracked,请参阅如何从"git stash save --all"中恢复?)

假设你已经收回了你的内容,并希望stash完全消除这个引用,那就可以了.请注意,这是"来自轨道的核武器"选项 - 在您确定准备好之前不要这样做:

git update-ref -d refs/stash
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你.我设法从`git reflog stash`获取提交ID,然后我设法`git stash apply stash @ {2}`.一旦我承诺,我就使用了来自轨道选项的核武器,我很高兴.谢谢. (2认同)
  • 不太令人惊讶; `git stash clear`应该做相同的"来自轨道的核武器"的事情.无论如何,你都失去了所有的旧藏物...... (2认同)

Ari*_*zis 5

您不必对所有藏书进行核算。您可以使用手动删除仅损坏的git reflog。在您的情况下:

git reflog delete --rewrite stash@{1}
git reflog delete --rewrite stash@{0}
Run Code Online (Sandbox Code Playgroud)

(我在这里将它们以相反的顺序排列,因为每次删除都会减少以下条目的编号。实际上,不要费心地进行数学运算,只需git stash list在每次删除之后进行操作即可获取更新的列表,并从中选择另一个剩余的残破条目。 )