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

时间:2014-02-27 18:15:54

标签: 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

没关系,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

过去我曾经使用过git stash,但并没有遇到过这种情况。我最近重写了历史记录,以便在发布到github之前从历史记录中删除文件。我跑的命令是

git filter-branch --force --index-filter \
  'git rm --cached --ignore-unmatch FILENAME' \
  --prune-empty --tag-name-filter cat -- --all

有关如何修复藏匿的想法吗?

3 个答案:

答案 0 :(得分:23)

我认为filter-branch打破了你的藏匿处。如果git stash的参数与stash bag不够相符,则会得到not a stash reference投诉。

请注意git show stashref使用普通的旧git show,它不要求作为参数提供的提交类似于存储。如果git stash show以与其他git stash命令相同的方式失败,或者如果对有问题的存储的人工检查表明它不再是两个或三个父合并提交,那么这实际上是情况下。

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

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

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

(有关藏匿袋和藏匿袋的更多信息,包括与--all--untracked一起使用的三父形式,请参阅How to recover from “git stash save --all”?。)

假设您已收回内容并希望完全删除stash引用,则可以执行此操作。请注意,这是"nuke it from orbit"选项 - 在您确定准备就绪之前不要这样做:

git update-ref -d refs/stash

答案 1 :(得分:5)

您不必将所有的藏匿处都记录下来。您可以使用git reflog手动删除损坏的那些。在你的情况下:

git reflog delete --rewrite stash@{1}
git reflog delete --rewrite stash@{0}

(我在这里以相反的顺序放置这些,因为每次删除都会减少以下条目的编号。实际上,不要费心去做数学,只需在每次删除后执行git stash list以获得更新的列表,选择另一个剩余的破碎条目。)

答案 2 :(得分:1)

以上所有答案对我都不起作用,以下命令有效,它可以删除您想要的一个藏匿处。我希望它对您有用。

```
git stash list

//--- apply target stash
git stash apply refs/stash@{n} 

//---- delete target stash
git stash drop --index n
// or
git stash drop refs/stash@{n}
```